MODULE disvert_std_mod USE icosa REAL(rstd), SAVE, ALLOCATABLE,TARGET :: ap(:) REAL(rstd), SAVE, ALLOCATABLE,TARGET :: bp(:) REAL(rstd), SAVE, ALLOCATABLE,TARGET :: presnivs(:) CONTAINS SUBROUTINE init_disvert USE icosa IMPLICIT NONE ALLOCATE(ap(llm+1)) ALLOCATE(bp(llm+1)) ALLOCATE(presnivs(llm)) CALL disvert(ap,bp,presnivs) END SUBROUTINE init_disvert SUBROUTINE disvert(ap,bp,presnivs) USE icosa IMPLICIT NONE REAL(rstd),INTENT(OUT) :: ap(:) REAL(rstd),INTENT(OUT) :: bp(:) REAL(rstd),INTENT(OUT) :: presnivs(:) REAL(rstd) :: dsig(llm) REAL(rstd) :: sig(llm+1) REAL(rstd) :: snorm INTEGER :: l snorm = 0. DO l = 1, llm dsig(l) = 1.0 + 7.0 * SIN( Pi*(l-0.5)/(llm+1) )**2 snorm = snorm + dsig(l) ENDDO DO l = 1, llm dsig(l) = dsig(l)/snorm ENDDO sig(llm+1) = 0. DO l = llm, 1, -1 sig(l) = sig(l+1) + dsig(l) ENDDO bp(llm+1) = 0. DO l = 1, llm bp(l) = EXP( 1. -1./( sig(l)*sig(l)) ) ap(l) = pa * ( sig(l) - bp(l) ) ENDDO bp(1)=1. ap(1)=0. ap(llm+1) = pa * ( sig(llm+1) - bp(llm+1) ) PRINT*,'ap',ap PRINT*,'bp',bp PRINT*, 'Niveaux de pressions approximatifs aux centres des' PRINT*, 'couches calcules pour une pression de surface =', preff PRINT*, 'et altitudes equivalentes pour une hauteur d echelle de' PRINT*, '8km' DO l = 1, llm presnivs(l) = 0.5 *( ap(l)+bp(l)*preff + ap(l+1)+bp(l+1)*preff ) PRINT*, 'PRESNIVS(',l,')=',presnivs(l),' Z ~ ',log(preff/presnivs(l))*8., & ' DZ ~ ',8.*log((ap(l)+bp(l)*preff)/ max(ap(l+1)+bp(l+1)*preff,1.e-10)) ENDDO END SUBROUTINE disvert END MODULE disvert_std_mod