dismp.f 5.14 KB
      subroutine dismp (xsnew,rosnew,ga,gb,gc,gd,ge,xss,roc,proj,ier)
c*
c***********************************************************************
c*
c*          "Copyright [c] CNES 98 - tous droits reserves"
c*          **********************************************
c*
c*PRO MAGLIB
c*
c*VER 99.03.31 - V 1.0
c*VER 01.06.05 - V 2.0
c*VER 03.01.06 - V 2.1
c*
c*AUT spec. CNES - JC KOSIK - janvier 1991
c*AUT port. CISI
c*
c*ROL Theme : Frontieres et regions
c*ROL         Calcul de la distance du satellite a la frontiere.
c*ROL         sxsnew et rosnew sont les coordonnees cylindriques
c*ROL         du satellite. 
c*ROL         ga.....ge sont les parametres definissant l'equation
c*ROL         quadratique de la frontiere.
c*
c*PAR xsnew  (I) : coordonnee en x du satellite dans le repere inertiel
c*               : (rayons terrestres)
c*
c*PAR rosnew (I) : distance du satellite a l'axe de symetrie axiale
c*               : (rayons terrestres)
c*
c*PAR ga     (I) : parametre de l'equation de la frontiere
c*PAR gb     (I) : parametre de l'equation de la frontiere
c*PAR gc     (I) : parametre de l'equation de la frontiere
c*PAR gd     (I) : parametre de l'equation de la frontiere
c*PAR ge     (I) : parametre de l'equation de la frontiere
c*
c*PAR xss    (I) : parametre de l'equation de la frontiere
c*
c*PAR roc    (O) : distance a l'axe du pied de la normale a la frontiere
c*               : (rayons terrestres)
c*
c*PAR proj   (O) : distance du satellite a la frontiere
c*               : (rayons terrestres)
c*
c*PAR ier    (O) : code de retour
c*
c*NOT ga .. ge   : Ces parametres definissent l'equation de la
c*NOT            : frontiere dans le repere de symetrie axiale
c*
c*NOT ier        : sans objet
c*
c*INF utilise    : rac2
c*
c*HST version 1.0 - 99.03.31 - creation de la maglib au CDPP
c*HST version 2.0 - 01.06.05 - correction de commentaires de code
c*HST version 2.1 - 03.01.06 - corrections en compilation avec g77
c*
c***********************************************************************
c*
      implicit none
c
c     ---------------------------------
c*FON Declaration identificateur rcs_id
c     ---------------------------------
c
      character rcs_id*100
c
c     --------------------------
c*FON Declaration des parametres
c     --------------------------
c
      double precision xsnew, rosnew
      double precision ga, gb, gc, gd, ge, xss
      double precision roc, proj
      integer ier
c
c     ---------------------------------
c*FON Declaration des variables locales
c     ---------------------------------
c
      integer irac
c*LOC irac : nombre de racines
c
      integer ier1
c*LOC ier1 : code retour des modules appeles
c
      double precision aa,bb,cc
c*LOC aa,bb,cc : coefficients de l'equation du 2eme degre
c
      double precision r1,r2
c*LOC r1,r2 : racines de l'equation
c
      double precision arond,gbm2,gcm,prod1,prod2
      double precision ronorm,term1,term2,xc,xm
c*LOC Variables de travail intermediaires
c
      SAVE
c
c     ---------------------------------
c*FON Affectation identificateur rcs_id
c     ---------------------------------
c
      data rcs_id /"
     >$Id$"/
c
c     ******************
c     Debut de programme
c     ******************
c
      ier  = 0
      ier1 = 0
c
      if (rosnew .ne. 0.d0) then
c
         if (xsnew .ge. 0.d0) then
c
            xm   = rosnew / xsnew
            gcm  = gc * xm
            gbm2 = gb * xm * xm
            aa   = ga + gbm2
            bb   = gcm + gd
            cc   = ge
c
            call rac2(aa,bb,cc,r1,r2,irac,ier1)
c
            prod1 = r1 * xsnew
            prod2 = r2 * xsnew
            xc    = r1
c
            if (prod2 .gt. 0.d0 .and. irac .eq. 2) then
               xc = min(r1,r2)
            endif
c
            roc = xm * xc
c
            if (xsnew .eq. 0.d0) then
c
               aa = gb
               bb = gc
               cc = ge
c
               call rac2(aa,bb,cc,r1,r2,irac,ier1)
c
               xc  = 0.d0
               roc = r1
c
            endif
c
            term1 = (2.d0 * ga * xc + gd)**2
            term2 = (2.d0 * gb * roc + gc)**2
            arond = sqrt(term1 + term2)
            prod1 = (2.d0 * ga * xc + gd) * (xsnew - xc) / arond
            prod2 = (2.d0 * gb * roc + gc) * (rosnew - roc) / arond
            proj  = prod1 + prod2
c
         else if (xsnew .eq. 0.d0) then
c
            term1 = gd**2
            term2 = (2.d0 * gb * roc + gc)**2
            arond = sqrt(term1 + term2)
            prod2 = (2.d0 * gb * roc + gc) * (rosnew - roc) / arond
            prod1 = 0.d0
            proj  = prod1 + prod2
c
         else if (xsnew .lt. 0.d0) then
c
            aa = gb
            bb = gc
            cc = ga * xsnew * xsnew + gd * xsnew + ge
c
            call rac2(aa,bb,cc,r1,r2,irac,ier1)
c
            xc     = xsnew
            roc    = r1
            term1  = (2.d0 * ga * xc + gd)**2
            term2  = (2.d0 * gb * roc + gc)**2
            arond  = sqrt(term1 + term2)
            ronorm = (2.d0 * gb * roc + gc) / arond
            proj   = ronorm * (rosnew - roc)
c
         endif
c
      else if (rosnew .eq. 0.d0) then
c
         proj = xss - xsnew
c
      endif
c
c     ****************
c     Fin de programme
c     ****************
c
      return
      end