Ignore:
Timestamp:
Oct 28, 2024, 11:17:48 AM (3 weeks ago)
Author:
abarral
Message:

Turn comgeom.h comgeom2.h into modules

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/dyn3d/guide_mod.f90

    r5272 r5281  
    88!            F. Codron 01/09
    99!=======================================================================
    10 
    11   USE getparam, only: ini_getparam, fin_getparam, getpar
     10    USE getparam, only: ini_getparam, fin_getparam, getpar
    1211  USE Write_Field
    1312  use netcdf, only: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close, &
     
    9291
    9392! ---------------------------------------------
    94 ! Lecture des parametres: 
     93! Lecture des parametres:
    9594! ---------------------------------------------
    9695    call ini_getparam("nudging_parameters_out.txt")
     
    172171
    173172    call fin_getparam
    174    
     173
    175174! ---------------------------------------------
    176175! Determination du nombre de niveaux verticaux
     
    230229
    231230
    232     endif 
     231    endif
    233232    error=nf90_inq_dimid(ncidpl,'LEVEL',rid)
    234233    IF (error.NE.NF90_NOERR) error=nf90_inq_dimid(ncidpl,'PRESSURE',rid)
     
    237236    ENDIF
    238237    error=nf90_inquire_dimension(ncidpl,rid,len=nlevnc)
    239     write(*,*)trim(modname)//' : number of vertical levels nlevnc', nlevnc 
     238    write(*,*)trim(modname)//' : number of vertical levels nlevnc', nlevnc
    240239    rcod = nf90_close(ncidpl)
    241240
     
    264263    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
    265264    alpha_u=0.;alpha_v=0;alpha_T=0;alpha_Q=0;alpha_P=0
    266    
     265
    267266    IF (guide_u) THEN
    268267        ALLOCATE(unat1(iip1,jjp1,nlevnc), stat = error)
     
    288287        tnat1=0.;tnat2=0.;tgui1=0.;tgui2=0.
    289288    ENDIF
    290      
     289
    291290    IF (guide_Q) THEN
    292291        ALLOCATE(qnat1(iip1,jjp1,nlevnc), stat = error)
     
    361360    USE comconst_mod, ONLY: cpp, dtvr, daysec,kappa
    362361    USE comvert_mod, ONLY: ap, bp, preff, presnivs, pressure_exner
    363  
     362
    364363    USE dimensions_mod, ONLY: iim, jjm, llm, ndm
    365364USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
     
    391390    REAL          :: tau,reste ! position entre 2 etats de guidage
    392391    REAL, SAVE    :: factt ! pas de temps en fraction de jour
    393    
     392
    394393    INTEGER       :: l
    395394    CHARACTER(LEN=20) :: modname="guide_main"
     
    402401    IF (first) THEN
    403402        first=.FALSE.
    404         CALL guide_init 
     403        CALL guide_init
    405404        itau_test=1001
    406405        step_rea=1
    407406        count_no_rea=0
    408407! Calcul des constantes de rappel
    409         factt=dtvr*iperiod/daysec 
     408        factt=dtvr*iperiod/daysec
    410409        call tau2alpha(3,iip1,jjm ,factt,tau_min_v,tau_max_v,alpha_v)
    411410        call tau2alpha(2,iip1,jjp1,factt,tau_min_u,tau_max_u,alpha_u)
     
    421420            enddo
    422421        endif
    423 ! ini_anal: etat initial egal au guidage       
     422! ini_anal: etat initial egal au guidage
    424423        IF (ini_anal) THEN
    425424            CALL guide_interp(ps,teta)
     
    464463            itau
    465464              abort_message='stopped'
    466               CALL abort_gcm(modname,abort_message,1) 
     465              CALL abort_gcm(modname,abort_message,1)
    467466          ELSE
    468467              IF (guide_v) vnat1=vnat2
     
    503502
    504503!-----------------------------------------------------------------------
    505 !   Ajout des champs de guidage 
     504!   Ajout des champs de guidage
    506505!-----------------------------------------------------------------------
    507506! Sauvegarde du guidage?
    508     f_out=((MOD(itau,iguide_sav).EQ.0).AND.guide_sav) 
     507    f_out=((MOD(itau,iguide_sav).EQ.0).AND.guide_sav)
    509508    IF (f_out) THEN
    510509      ! compute pressures at layer interfaces
     
    522521      CALL guide_out("SP",jjp1,llm,p(:,1:llm))
    523522    ENDIF
    524    
     523
    525524    if (guide_u) then
    526525        if (guide_add) then
     
    528527        else
    529528           f_add=(1.-tau)*ugui1+tau*ugui2-ucov
    530         endif 
     529        endif
    531530        if (guide_zon) CALL guide_zonave(1,jjp1,llm,f_add)
    532531        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_u)
     
    542541        else
    543542           f_add=(1.-tau)*tgui1+tau*tgui2-teta
    544         endif 
     543        endif
    545544        if (guide_zon) CALL guide_zonave(2,jjp1,llm,f_add)
    546545        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_T)
     
    554553        else
    555554           f_add(1:ip1jmp1,1)=(1.-tau)*psgui1+tau*psgui2-ps
    556         endif 
     555        endif
    557556        if (guide_zon) CALL guide_zonave(2,jjp1,1,f_add(1:ip1jmp1,1))
    558557        CALL guide_addfield(ip1jmp1,1,f_add(1:ip1jmp1,1),alpha_P)
     
    568567        else
    569568           f_add=(1.-tau)*qgui1+tau*qgui2-q
    570         endif 
     569        endif
    571570        if (guide_zon) CALL guide_zonave(2,jjp1,llm,f_add)
    572571        CALL guide_addfield(ip1jmp1,llm,f_add,alpha_Q)
     
    580579        else
    581580           f_add(1:ip1jm,:)=(1.-tau)*vgui1+tau*vgui2-vcov
    582         endif 
     581        endif
    583582        if (guide_zon) CALL guide_zonave(2,jjm,llm,f_add(1:ip1jm,:))
    584583        CALL guide_addfield(ip1jm,llm,f_add(1:ip1jm,:),alpha_v)
     
    599598    INTEGER,                      INTENT(IN)    :: hsize
    600599    INTEGER,                      INTENT(IN)    :: vsize
    601     REAL, DIMENSION(hsize),       INTENT(IN)    :: alpha 
     600    REAL, DIMENSION(hsize),       INTENT(IN)    :: alpha
    602601    REAL, DIMENSION(hsize,vsize), INTENT(INOUT) :: field
    603602
     
    615614
    616615    USE comconst_mod, ONLY: pi
    617    
     616
    618617    USE dimensions_mod, ONLY: iim, jjm, llm, ndm
    619618USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
    620619          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
     620    USE comgeom_mod_h
    621621IMPLICIT NONE
    622622
    623623
    624624
    625     INCLUDE "comgeom.h"
    626    
     625
    627626    ! input/output variables
    628627    INTEGER,                           INTENT(IN)    :: typ
     
    665664                fieldm(j,l)=fieldm(j,l)+field(ij,l)
    666665            ENDDO
    667         ENDDO 
     666        ENDDO
    668667        fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
    669668    ! Compute forcing
     
    680679!=======================================================================
    681680  SUBROUTINE guide_interp(psi,teta)
    682  
     681
    683682  use exner_hyb_m, only: exner_hyb
    684683  use exner_milieu_m, only: exner_milieu
     
    686685  use comvert_mod, only: preff, pressure_exner, bp, ap
    687686  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
    688 USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
     687  USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
    689688          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
     689  USE comgeom2_mod_h
    690690IMPLICIT NONE
    691 
    692 
    693 
    694   include "comgeom2.h"
    695 
    696691  REAL, DIMENSION (iip1,jjp1),     INTENT(IN) :: psi ! Psol gcm
    697692  REAL, DIMENSION (iip1,jjp1,llm), INTENT(IN) :: teta ! Temp. Pot. gcm
     
    702697  REAL, DIMENSION (iip1,jjp1,llm)    :: plunc,plsnc !niveaux pression modele
    703698  REAL, DIMENSION (iip1,jjm,llm)     :: plvnc       !niveaux pression modele
    704   REAL, DIMENSION (iip1,jjp1,llmp1)  :: p           ! pression intercouches 
     699  REAL, DIMENSION (iip1,jjp1,llmp1)  :: p           ! pression intercouches
    705700  REAL, DIMENSION (iip1,jjp1,llm)    :: pls, pext   ! var intermediaire
    706   REAL, DIMENSION (iip1,jjp1,llm)    :: pbarx 
    707   REAL, DIMENSION (iip1,jjm,llm)     :: pbary 
     701  REAL, DIMENSION (iip1,jjp1,llm)    :: pbarx
     702  REAL, DIMENSION (iip1,jjm,llm)     :: pbary
    708703  ! Variables pour fonction Exner (P milieu couche)
    709704  REAL, DIMENSION (iip1,jjp1,llm)    :: pk
    710   REAL, DIMENSION (iip1,jjp1)        :: pks   
     705  REAL, DIMENSION (iip1,jjp1)        :: pks
    711706  REAL                               :: prefkap,unskap
    712707  ! Pression de vapeur saturante
    713708  REAL, DIMENSION (ip1jmp1,llm)      :: qsat
    714709  !Variables intermediaires interpolation
    715   REAL, DIMENSION (iip1,jjp1,llm)    :: zu1,zu2 
     710  REAL, DIMENSION (iip1,jjp1,llm)    :: zu1,zu2
    716711  REAL, DIMENSION (iip1,jjm,llm)     :: zv1,zv2
    717  
     712
    718713  INTEGER                            :: i,j,l,ij
    719714  CHARACTER(LEN=20),PARAMETER :: modname="guide_interp"
    720  
     715
    721716    write(*,*)trim(modname)//': interpolate nudging variables'
    722717! -----------------------------------------------------------------
     
    767762        endif
    768763    endif
    769    
     764
    770765! -----------------------------------------------------------------
    771 ! Calcul niveaux pression modele 
     766! Calcul niveaux pression modele
    772767! -----------------------------------------------------------------
    773768    CALL pression( ip1jmp1, ap, bp, psi, p )
     
    839834                    ugui2(ij,l)=zu2(i,j,l)*cu(i,j)
    840835                enddo
    841                 ugui1(j*iip1,l)=ugui1((j-1)*iip1+1,l)   
    842                 ugui2(j*iip1,l)=ugui2((j-1)*iip1+1,l)   
     836                ugui1(j*iip1,l)=ugui1((j-1)*iip1+1,l)
     837                ugui2(j*iip1,l)=ugui2((j-1)*iip1+1,l)
    843838            enddo
    844839            do i=1,iip1
     
    850845        enddo
    851846    ENDIF
    852    
     847
    853848    IF (guide_T) THEN
    854849        CALL pres2lev(tnat1,zu1,nlevnc,llm,plnc1,plsnc,iip1,jjp1,invert_p)
     
    869864                    enddo
    870865                ENDIF
    871                 tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l)   
    872                 tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l)   
     866                tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l)
     867                tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l)
    873868            enddo
    874869            do i=1,iip1
    875870                tgui1(i,l)=tgui1(1,l)
    876                 tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l) 
     871                tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l)
    877872                tgui2(i,l)=tgui2(1,l)
    878                 tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l) 
     873                tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l)
    879874            enddo
    880875        enddo
     
    893888                    vgui2(ij,l)=zv2(i,j,l)*cv(i,j)
    894889                enddo
    895                 vgui1(j*iip1,l)=vgui1((j-1)*iip1+1,l)   
    896                 vgui2(j*iip1,l)=vgui2((j-1)*iip1+1,l)   
     890                vgui1(j*iip1,l)=vgui1((j-1)*iip1+1,l)
     891                vgui2(j*iip1,l)=vgui2((j-1)*iip1+1,l)
    897892            enddo
    898893        enddo
    899894    ENDIF
    900    
     895
    901896    IF (guide_Q) THEN
    902897        ! On suppose qu'on a la bonne variable dans le fichier de guidage:
     
    911906                    qgui2(ij,l)=zu2(i,j,l)
    912907                enddo
    913                 qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l)   
    914                 qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l)   
     908                qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l)
     909                qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l)
    915910            enddo
    916911            do i=1,iip1
    917912                qgui1(i,l)=qgui1(1,l)
    918                 qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l) 
     913                qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l)
    919914                qgui2(i,l)=qgui2(1,l)
    920                 qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l) 
     915                qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l)
    921916            enddo
    922917        enddo
     
    924919            CALL q_sat(iip1*jjp1*llm,teta*pk/cpp,plsnc,qsat)
    925920            qgui1=qgui1*qsat*0.01 !hum. rel. en %
    926             qgui2=qgui2*qsat*0.01 
     921            qgui2=qgui2*qsat*0.01
    927922        ENDIF
    928923    ENDIF
     
    937932    use comconst_mod, only: pi
    938933    use serre_mod, only: clon, clat, grossismx, grossismy
    939    
     934
    940935    USE dimensions_mod, ONLY: iim, jjm, llm, ndm
    941 USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
     936    USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
    942937          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
    943 implicit none
    944 
    945 
    946 
    947     include "comgeom2.h"
    948 
     938    USE comgeom2_mod_h
     939    implicit none
    949940! input arguments :
    950941    INTEGER, INTENT(IN) :: typ    ! u(2),v(3), ou scalaire(1)
     
    953944    REAL, INTENT(IN)    :: taumin,taumax
    954945! output arguments:
    955     REAL, DIMENSION(pim,pjm), INTENT(OUT) :: alpha 
    956  
     946    REAL, DIMENSION(pim,pjm), INTENT(OUT) :: alpha
     947
    957948!  local variables:
    958949    LOGICAL, SAVE               :: first=.TRUE.
     
    10401031        ENDIF
    10411032! Premier appel: calcul des aires min et max et de gamma.
    1042         IF (first) THEN 
     1033        IF (first) THEN
    10431034            first=.FALSE.
    10441035            ! coordonnees du centre du zoom
    1045             CALL coordij(clon,clat,ilon,ilat) 
     1036            CALL coordij(clon,clat,ilon,ilat)
    10461037            ! aire de la maille au centre du zoom
    10471038            dxdy_min=dxdys(ilon,ilat)
     
    10671058              endif
    10681059              gamma=log(0.5)/log(gamma)
    1069               if (gamma4) then 
     1060              if (gamma4) then
    10701061                gamma=min(gamma,4.)
    10711062              endif
     
    11681159             ENDIF
    11691160             rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
    1170              IF (rcode.NE.NF90_NOERR) THEN 
     1161             IF (rcode.NE.NF90_NOERR) THEN
    11711162              abort_message='Nudging: error -> no PRES variable in file P.nc'
    11721163              CALL abort_gcm(modname,abort_message,1)
     
    12211212             write(*,*) trim(modname)//' ncidv,varidv',ncidv,varidv
    12221213             if (ncidpl.eq.-99) ncidpl=ncidv
    1223              
     1214
    12241215             status=NF90_INQ_DIMID(ncidv, "LONV", dimid)
    12251216             status=NF90_INQUIRE_DIMENSION(ncidv,dimid,namedim,lendim)
    1226              
     1217
    12271218                IF (lendim .NE. iip1) THEN
    12281219                abort_message='dimension LONV different from iip1 in v.nc'
     
    12371228                CALL abort_gcm(modname,abort_message,1)
    12381229             ENDIF
    1239        
     1230
    12401231         endif
    12411232
     
    13501341     count(4)=1
    13511342
    1352 ! Pression 
     1343! Pression
    13531344     if (guide_plevs.EQ.2) then
    13541345         status=NF90_GET_VAR(ncidp,varidp,pnat2,start,count)
     
    13821373           CALL invert_lat(iip1,jjp1,nlevnc,qnat2)
    13831374         ENDIF
    1384          
     1375
    13851376     endif
    13861377
     
    16721663
    16731664  END SUBROUTINE guide_read2D
    1674  
     1665
    16751666!=======================================================================
    16761667  SUBROUTINE guide_out(varname,hsize,vsize,field)
     
    16801671    use netcdf95, only: nf95_def_var, nf95_put_var
    16811672    use netcdf, only: nf90_float, nf90_def_var, nf90_put_var
    1682    
     1673
    16831674    USE dimensions_mod, ONLY: iim, jjm, llm, ndm
    1684 USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
     1675    USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
    16851676          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
     1677    USE comgeom2_mod_h
    16861678IMPLICIT NONE
    16871679
    16881680
    16891681
    1690     INCLUDE "comgeom2.h"
    16911682   
    16921683    ! Variables entree
Note: See TracChangeset for help on using the changeset viewer.