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