c****************************************************************** SUBROUTINE control_dPT(reprend) c subroutine de contrôle des variations temporelles de P, T utilisées pour c le calcul du Tds et l'évolution de la comp.chim. c routine private du module mod_static c Auteur: P.Morel, Département J.D. Cassini, O.C.A., CESAM2k c------------------------------------------------------------------ USE mod_donnees, ONLY : d_press, d_temp, kipp, en_m23, m_qs, ne USE mod_kind USE mod_numerique, ONLY : entre USE mod_variables, ONLY : bp, bp_t, idm6, inter, knot_t, mstar, 1 m_stat_t, n_qs, n_qs_t, qt_t, q_t, r_stat_t IMPLICIT NONE LOGICAL, INTENT(out) :: reprend REAL (kind=dp), ALLOCATABLE, DIMENSION(:,:) :: d_var, var, var_t REAL (kind=dp), DIMENSION(ne) :: dfqs, fqs REAL (kind=dp), SAVE, DIMENSION(2) :: dvar REAL (kind=dp), DIMENSION(2) :: max_var, m_max REAL (kind=dp) :: mk INTEGER, DIMENSION(2) :: loc_max INTEGER :: i, ideb, imax LOGICAL, DIMENSION(2) :: l_var LOGICAL, SAVE :: init=.TRUE. CHARACTER (len=13), SAVE, DIMENSION(2) :: text CHARACTER (len=6), SAVE, DIMENSION(2) :: textd CHARACTER (len=3), DIMENSION(2) :: vbl=(/ 'P: ','T: ' /) CHARACTER (len=10) :: text0='max var/t ' CHARACTER (len=3) :: textd0=', d' c------------------------------------------------------------------ 2000 FORMAT(8es10.3) c initialisations IF(init)THEN init=.FALSE. dvar=(/ d_press, d_temp /) DO i=1,2 text(i)=text0//vbl(i) textd(i)=textd0//vbl(i) ENDDO ENDIF c si le tableau bp_t n'est pas encore alloué IF(.NOT.ALLOCATED(bp_t))THEN reprend=.FALSE. RETURN ENDIF c recherche de l'indice maximum imax, tel que mk soit contenu dans m_stat_t ideb=MIN(n_qs,n_qs_t,idm6) DO imax=n_qs-3,1,-1 IF(imax >= ideb)CYCLE mk=bp(5,m_qs*(imax-1)+1) IF(entre(m_stat_t(1),m_stat_t(n_qs_t),mk))EXIT ENDDO c variations de P et T en tous points ALLOCATE(d_var(2,imax),var(2,imax),var_t(2,imax)) d_var=0.d0 DO i=1,imax mk=bp(5,m_qs*(i-1)+1) c P et T au temps t+dt var(1:2,i)=bp(1:2,m_qs*(i-1)+1) c P et T au temps t CALL inter('m',bp_t,q_t,qt_t,n_qs_t,knot_t,mk,fqs,dfqs,r_stat_t,m_stat_t) var_t(1:2,i)=fqs(1:2) c différences relatives pour lnP, lnT d_var(1:2,i)=2.d0*ABS(var(1:2,i)-var_t(1:2,i))/(var(1:2,i)+var_t(1:2,i)) ENDDO c localisations des variations maximales max_var=MAXVAL(d_var,dim=2) loc_max=MAXLOC(d_var,dim=2) c les masses aux variations maximales m_max(1:2)=bp(5,m_qs*(loc_max(1:2)-1)+1) c logiques l_var=max_var > dvar reprend=COUNT(l_var) >= 1 c les masses aux max de variations IF(en_m23)THEN m_max=SQRT(m_max)**3 ELSE m_max=m_max**3 ENDIF c ecritures IF(reprend)THEN WRITE(*,1) !; WRITE(2,1) 1 FORMAT(/,'------Contrôle des variations-------------') DO i=1,2 WRITE(*,2)text(i),EXP(var_t(i,loc_max(i))),EXP(var(i,loc_max(i))), 1 textd(i),max_var(i),dvar(i),m_max(i),loc_max(i),idm6 WRITE(2,2)text(i),EXP(var_t(i,loc_max(i))),EXP(var(i,loc_max(i))), 1 textd(i),max_var(i),dvar(i),m_max(i),loc_max(i),idm6 2 FORMAT(a13,es10.3, ' -->',es10.3,a6,es10.3, 1 ' > ',es10.3,/,'M/Msol=',es10.3,', couche:',i4,' < idm6=',i4) ENDDO WRITE(*,5) ; WRITE(2,5) 5 FORMAT('Variations temporelles de P ou T trop importantes, réduction du dt') c PAUSE'control DPT' ELSE WRITE(*,6) !; WRITE(2,6) !; PAUSE'control_dPT' 6 FORMAT(/,'Variations temporelles maximales de P, et T dans les limites') ENDIF DEALLOCATE(d_var,var,var_t) RETURN END SUBROUTINE control_dPT