c*********************************************************************** INTEGER FUNCTION actu_nqs(cmax) c Fonction PRIVATE du module mod_static c actualisation du nombres de couches c entrées: c cmax=.TRUE. : utilisation du maximum de couche c sortie: c actu_nqs: nombre de couches actualisé c Auteur: P.Morel, Laboratoire Lagrange, O.C.A., CESAM2k c--------------------------------------------------------------------------------- USE mod_donnees, ONLY : dpsim, dpsip, en_m23, langue, m_qs, nc_max, 1 n_max, n_min, precision, psi0 USE mod_kind USE mod_numerique, ONLY : entre, inside USE mod_variables, ONLY : bp, n_qs IMPLICIT NONE LOGICAL, INTENT(in) :: cmax REAL (kind=dp), DIMENSION(n_qs) :: dm REAL (kind=dp) :: delta_psi, dm_max, dm_min, psi INTEGER, DIMENSION(1) :: i_max, i_min INTEGER :: i, idpsi, new_n c------------------------------------------------------------------------------------ 2000 FORMAT(8es10.3) c WRITE(*,2000)psi0 ; PRINT*,'cmax',cmax ; PAUSE'actu_nqs entrée' c maximum et minimum d'épaisseur des couches DO i=1,n_qs dm(i)=bp(5,m_qs*(i-1)+1)**3 ENDDO IF(en_m23)dm=SQRT(dm) DO i=1,n_qs-1 dm(i)=dm(i+1)-dm(i) ENDDO dm(n_qs)=dm(n_qs-1) dm_max=MAXVAL(dm) ; dm_min=MINVAL(dm) i_max=MAXLOC(dm) ; i_min=MINLOC(dm) WRITE(*,5)dm_max,i_max(1),dm_min,i_min(1) 5 FORMAT(/,'épaisseur (Msol) des couches, max:', es10.3,', couche:',i4, 1 ', min=',es10.3,', couche:'i4) c cmax=.TRUE. utilisation du nombre total de couches c si le modèle de reprise (*.rep) a n_max couches et l'arrêt avec, dans le *.don c |-n_max| couches (nc_max=T) est demandé, il n'y a pas de réajustement c du nombre de couches qui risquerait de diminuer, alors actu_nqs=n_qs IF(cmax .OR. (nc_max .AND. n_qs == n_max))THEN c IF(cmax .OR. (nc_max .AND. n_qs == n_max) .OR. precision(1:2) == 'He')THEN actu_nqs=n_max SELECT CASE(langue) CASE('english') WRITE(usl_static,1003)actu_nqs ; WRITE(2,1003)actu_nqs 1003 FORMAT ('Use of maximum number of shells, n_qs=',i5) CASE DEFAULT WRITE(usl_static,3)actu_nqs ; WRITE(2,3)actu_nqs 3 FORMAT('Utilisation du nombre maximum de couches, n_qs=',i5) END SELECT RETURN ENDIF c écart à la valeur de référence du facteur d'espacement psi=bp(6,1) delta_psi=(psi-psi0)/psi0 idpsi=NINT(delta_psi*100.d0) c PRINT*,idpsi,n_qs ; WRITE(*,2000)psi,psi0,delta_psi ; PAUSE'actu_nqs' c adaptation du nombre de couches si la cte. de répartition a varié de plus de dpsi c I2: IF(ABS(delta_psi) > dpsi)THEN I2: IF(.NOT.entre(dpsip,dpsim,delta_psi))THEN c estimation du nombre de couches nécessaire actu_nqs=NINT(psi/psi0*REAL(n_qs,dp)) c PRINT*,'actu_nqs1',actu_nqs c variation MAX du nb. de couches <= 10% actu_nqs=NINT(inside(REAL(n_qs,dp)*1.1d0,REAL(n_qs,dp)*0.9d0, 1 REAL(actu_nqs,dp))) c PRINT*,'actu_nqs2',actu_nqs c variation limitée à +/- r_add=100 couches, initialisé dans resout actu_nqs=inside(MAX(n_min,n_qs-r_add),MIN(n_max,n_qs+r_add),actu_nqs) c mais supérieure à 10 couches IF(ABS(n_qs-actu_nqs) < 10)actu_nqs=n_qs c PRINT*,'actu_nqs3',actu_nqs c on conserve n_qs ELSE I2 actu_nqs = n_qs c PRINT*,'actu_nqs6',actu_nqs ENDIF I2 c pour écritures new_n = actu_nqs c PRINT*,'actu_nqs7',actu_nqs c le nombre de couche doit être modifié I6: IF(new_n /= n_qs)THEN c écritures, nombre de couches et variation de la constante d'espacement SELECT CASE(langue) CASE('english') WRITE(usl_static,1001)n_qs,new_n,idpsi,psi,psi0 WRITE(2,1001)n_qs,new_n,idpsi,psi,psi0 1001 FORMAT('number of shells n=',i5,'-->',i5,', dpsi=',i4, 1 '%, psi=',es10.3,', psi0=',es10.3) CASE DEFAULT WRITE(usl_static,1)n_qs,new_n,idpsi,psi,psi0 WRITE(2,1)n_qs,new_n,idpsi,psi,psi0 1 FORMAT('nombre de couches n=',i5,'-->',i5,', dpsi=',i4, 1 '%, psi=',es10.3,', psi0=',es10.3) END SELECT c PAUSE'actu_nqs,n_qs' c le nombre maximum de couches a été atteint ELSEIF(new_n == n_max)THEN SELECT CASE(langue) CASE('english') WRITE(usl_static,1004)n_qs,idpsi,psi,psi0 WRITE(2,1004)n_qs,idpsi,psi,psi0 1004 FORMAT(/,'the maximum number of shells is reached, n_qs=',i5,', dpsi=',i4, 1 '%, psi=',es10.3,', psi0=',es10.3,/) CASE DEFAULT WRITE(usl_static,4)n_qs,idpsi,psi,psi0 WRITE(2,4)n_qs,idpsi,psi,psi0 4 FORMAT(/,'nombre de couches max atteint, n_qs=n_max',i5,', dpsi=',i4, 1 '%, psi=',es10.3,', psi0=',es10.3,/) END SELECT c n_qs est inchangé ELSE I6 SELECT CASE(langue) CASE('english') WRITE(usl_static,1002)n_qs,idpsi,psi,psi0 WRITE(2,1002)n_qs,idpsi,psi,psi0 1002 FORMAT('the number of shells is kept, n_qs=',i5,', dpsi=',i4, 1 '%, psi=',es10.3,', psi0=',es10.3) CASE DEFAULT WRITE(usl_static,2)n_qs,idpsi,psi,psi0 WRITE(2,2)n_qs,idpsi,psi,psi0 2 FORMAT('nombre de couches inchangé, n_qs=',i5,', dpsi=',i4, 1 '%, psi=',es10.3,', psi0=',es10.3) END SELECT ENDIF I6 RETURN END FUNCTION actu_nqs