Ignore:
Timestamp:
Jul 1, 2024, 11:25:05 AM (6 days ago)
Author:
dcugnet
Message:
  • strings_mod:
    • remove "test()" function (was not very clear)
    • modifications of the "str2bool" function: result is O/1 for .FALSE./.TRUE. and -1 if the string was not a boolean.
    • more general "find()" function (for several numerical types)
    • more general "cat()" function (can append a 2D array with vectors, 1D arrays with scalars)
    • few simplifications (in "strParse") and minor changes
  • readTracFiles_mod:
    • remove internal usage of direct keys ("%" symbol) in favor of the "getKey" function. => moving toward a totally generic tracers derived type.
    • improve the internal management of the error return value "lerr".
    • remove "fGetKey", "fGetKeys", "setDirectKeys" functions
    • new functions to add/remove a phase: "addPhase", "delPhase"
    • more general "addKey(key[(:)], val[(:)], ky(:), [lOverWrite])" function: . input argument "val" can be string/integer/real/logical . (key, val, ky ): add the <key> =<val> pair to ky . (key, val(:), ky(:)): add the <key> =<val(i)> pair to ky(i) for 1<=i<=SIZE(ky) . (key(:), val(:), ky(:)): add the <key(i)>=<val(i)> pair to ky(i) for 1<=i<=SIZE(ky)
    • more general "getKey(key[(:)], val[(:)], itr [, ky(:)][, nam(:)][, def][, lDisp])" (tracer index version)

and "getKey(key[(:)], val[(:)], tname[, ky(:)]. [, def][, lDisp])" (tracer name version) functions:

. output argument "val" can be string/integer/real/logical
. if present, the default value <def> is retained if the corresponding key was not found.
. get values from "ky(:)" if present, otherwise from internal database "tracers(:)" or "isotope ».
. if "keyn" is a vector, try with each element in indices order until a value is found
. (key[(:)], val, itr/tname[,ky(:)][, ...]): get the value <val> of tracer nr. itr or named "tname"
. (key[(:)], val(:), itr/tname[,ky(:)][, ...]): same + parsing of the value with « , », then storage in <val(:)>
. (key[(:)], val(:)[, ky(:)][, nam(:)][, ...]): same for all tracers (optional names list <nam(:)>) of database.
. (key[(:)], val(:), tname(:)[, ky(:)][, ...]): same for the tracers named « tnames(:)"

  • more general "dispTraSection" function
  • much simplified "indexUpdate" function ; "ancestor*" and "idxAncestor" functions are removed.
  • "readIsotopesFile" is renamed to "processIsotopes" for more clarity
  • cosmetic changes
  • fix for isotopes: iq_val and iq_liq are usable for "q" only, not for "q_follow" and "zx_defau_diag" => use hardcoded indices (1 for vapor and 2 for liquid) for these variables
File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/dyn3d/qminimum.F

    r4143 r5001  
    2828c     .................................................................
    2929c
     30cDC iq_val and iq_liq are usable for q only, NOT for q_follow
     31c   and zx_defau_diag (crash if iq_val/liq==3) => vapor/liquid
     32c   water at hardcoded indices 1/2 in these variables
    3033      INTEGER i, k, iq
    3134      REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
     
    5861
    5962      zx_defau_diag(:,:,:)=0.0
    60       q_follow(:,:,1:2)=q(:,:,1:2) 
    61       DO 1000 k = 1, llm
    62         DO 1040 i = 1, ip1jmp1
     63      q_follow(:,:,1)=q(:,:,iq_vap) 
     64      q_follow(:,:,2)=q(:,:,iq_liq) 
     65      DO k = 1, llm
     66        DO i = 1, ip1jmp1
    6367          if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
    6468
    65               if (niso > 0) zx_defau_diag(i,k,iq_liq)=AMAX1
     69            if (niso > 0) zx_defau_diag(i,k,2)=AMAX1
    6670     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
    6771
    68              q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
    69              q(i,k,iq_liq) = seuil_liq
    70            endif
    71  1040   CONTINUE
    72  1000 CONTINUE
     72            q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
     73            q(i,k,iq_liq) = seuil_liq
     74          endif
     75        ENDDO
     76      ENDDO
    7377c
    7478c Quand l'eau vapeur est trop faible (ou negative), on complete
    7579c le defaut en prennant de l'eau vapeur de la couche au-dessous.
    7680c
    77       iq = iq_vap
    78 c
    7981      DO k = llm, 2, -1
    8082ccc      zx_abc = dpres(k) / dpres(k-1)
    8183        DO i = 1, ip1jmp1
    82           if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
     84          if ( seuil_vap - q(i,k,iq_vap) .gt. 0.d0 ) then
    8385
    84             if (niso > 0)
    85      &        zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
     86            if (niso > 0) zx_defau_diag(i,k,1)
     87     &           = AMAX1( seuil_vap - q(i,k,iq_vap), 0.0 )
    8688
    87             q(i,k-1,iq) =  q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
    88      &                     deltap(i,k) / deltap(i,k-1)
    89             q(i,k,iq)   =  seuil_vap 
     89            q(i,k-1,iq_vap) = q(i,k-1,iq_vap) - (seuil_vap
     90     &           -q(i,k,iq_vap)) * deltap(i,k)/deltap(i,k-1)
     91            q(i,k,iq_vap)   =  seuil_vap 
     92
    9093          endif
    9194        ENDDO
    9295      ENDDO
     96
    9397c
    9498c Quand il s'agit de la premiere couche au-dessus du sol, on
     
    96100c
    97101      DO i = 1, ip1jmp1
    98          zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq) )
    99          q(i,1,iq)  = AMAX1( q(i,1,iq), seuil_vap )
     102         zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq_vap) )
     103         q(i,1,iq_vap)  = AMAX1( q(i,1,iq_vap), seuil_vap )
    100104      ENDDO
    101105      pompe = SSUM(ip1jmp1,zx_pump,1)
     
    121125      DO i = 1,ip1jmp1
    122126        if (zx_pump(i).gt.0.0) then
    123           q_follow(i,1,iq_vap)=q_follow(i,1,iq_vap)+zx_pump(i)
     127          q_follow(i,1,1)=q_follow(i,1,1)+zx_pump(i)
    124128        endif !if (zx_pump(i).gt.0.0) then
    125129      enddo !DO i = 1,ip1jmp1
     
    129133      do k=2,llm
    130134        DO i = 1,ip1jmp1
    131           if (zx_defau_diag(i,k,iq_vap).gt.0.0) then             
     135          if (zx_defau_diag(i,k,1).gt.0.0) then             
    132136              ! on ajoute la vapeur en k             
    133137              do ixt=1,ntiso
    134138               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
    135      :           +zx_defau_diag(i,k,iq_vap)
    136      :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     139     :           +zx_defau_diag(i,k,1)
     140     :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,1)
    137141               
    138142              ! et on la retranche en k-1
    139143               q(i,k-1,iqIsoPha(ixt,iq_vap))=
    140144     :            q(i,k-1,iqIsoPha(ixt,iq_vap))
    141      :              -zx_defau_diag(i,k,iq_vap)
     145     :              -zx_defau_diag(i,k,1)
    142146     :              *deltap(i,k)/deltap(i,k-1)
    143147     :              *q(i,k-1,iqIsoPha(ixt,iq_vap))
    144      :              /q_follow(i,k-1,iq_vap)
     148     :              /q_follow(i,k-1,1)
    145149
    146150              enddo !do ixt=1,niso
    147               q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
    148      :               +zx_defau_diag(i,k,iq_vap)
    149               q_follow(i,k-1,iq_vap)=   q_follow(i,k-1,iq_vap)
    150      :               -zx_defau_diag(i,k,iq_vap)
     151              q_follow(i,k,1)=   q_follow(i,k,1)
     152     :               +zx_defau_diag(i,k,1)
     153              q_follow(i,k-1,1)=   q_follow(i,k-1,1)
     154     :               -zx_defau_diag(i,k,1)
    151155     :              *deltap(i,k)/deltap(i,k-1)
    152           endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     156          endif !if (zx_defau_diag(i,k,1).gt.0.0) then
    153157        enddo !DO i = 1, ip1jmp1       
    154158       enddo !do k=2,llm
     
    161165        do k=1,llm
    162166        DO i = 1,ip1jmp1
    163           if (zx_defau_diag(i,k,iq_liq).gt.0.0) then
     167          if (zx_defau_diag(i,k,2).gt.0.0) then
    164168
    165169              ! on ajoute eau liquide en k en k             
    166170              do ixt=1,ntiso
    167171               q(i,k,iqIsoPha(ixt,iq_liq))=q(i,k,iqIsoPha(ixt,iq_liq))
    168      :              +zx_defau_diag(i,k,iq_liq)
    169      :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)
     172     :              +zx_defau_diag(i,k,2)
     173     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)
    170174              ! et on la retranche à la vapeur en k
    171175               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
    172      :              -zx_defau_diag(i,k,iq_liq)
    173      :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)   
     176     :              -zx_defau_diag(i,k,2)
     177     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)   
    174178              enddo !do ixt=1,niso
    175               q_follow(i,k,iq_liq)=   q_follow(i,k,iq_liq)
    176      :               +zx_defau_diag(i,k,iq_liq)
    177               q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
    178      :               -zx_defau_diag(i,k,iq_liq)
    179           endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     179              q_follow(i,k,2)=   q_follow(i,k,2)
     180     :               +zx_defau_diag(i,k,2)
     181              q_follow(i,k,1)=   q_follow(i,k,1)
     182     :               -zx_defau_diag(i,k,2)
     183          endif !if (zx_defau_diag(i,k,1).gt.0.0) then
    180184        enddo !DO i = 1, ip1jmp1
    181185       enddo !do k=2,llm 
Note: See TracChangeset for help on using the changeset viewer.