Changeset 3371 for trunk/LMDZ.PLUTO


Ignore:
Timestamp:
Jun 12, 2024, 8:43:20 PM (5 months ago)
Author:
tbertrand
Message:

LMDZ.PLUTO
Merging the generic newstart.F with the Pluto.old newstart.F.
TB

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.PLUTO/libf/dynphy_lonlat/phypluto/newstart.F

    r3228 r3371  
    66c   Auteur:   Christophe Hourdin/Francois Forget/Yann Wanherdrick
    77c   ------
    8 c             Derniere modif : 12/03
    9 c
     8c             Adapted to Pluto: Tanguy Bertrand
     9c             Derniere modif : 06/2024
    1010c
    1111c   Objet:  Create or modify the initial state for the LMD Mars GCM
    1212c   -----           (fichiers NetCDF start et startfi)
    1313c
    14 c
    1514c=======================================================================
    1615
     
    1918     &                              is_master
    2019      use infotrac, only: infotrac_init, nqtot, tname
    21       USE tracer_h, ONLY: igcm_n2
     20      USE tracer_h, ONLY: igcm_n2,igcm_ch4_ice,igcm_co_ice,igcm_haze,
     21     &                   igcm_prec_haze,igcm_co_gas,igcm_ch4_gas,noms
    2222      USE comsoil_h, ONLY: nsoilmx, layer, mlayer, inertiedat
    2323      USE surfdat_h, ONLY: phisfi, albedodat,
    2424     &                     zmea, zstd, zsig, zgam, zthe
    25 ! TB24      USE nonoro_gwd_ran_mod, ONLY: du_nonoro_gwd, dv_nonoro_gwd,
    26 !     &                              east_gwstress, west_gwstress
    2725      use datafile_mod, only: datadir, surfdir
    2826      use ioipsl_getin_p_mod, only: getin_p
     
    3028      use phyredem, only: physdem0, physdem1
    3129      use iostart, only: open_startphy
    32 !      use slab_ice_h, only:noceanmx
    33 !      USE ocean_slab_mod, ONLY: nslay
    3430      use filtreg_mod, only: inifilr
    3531      USE mod_const_mpi, ONLY: COMM_LMDZ
     
    6662      CHARACTER        relief*3
    6763
    68 
    6964c Variables pour les lectures NetCDF des fichiers "start_archive"
    7065c--------------------------------------------------
     
    9085      REAL w(iip1,jjp1,llm+1)
    9186      REAL pbaru(ip1jmp1,llm),pbarv(ip1jm,llm)
    92 !      REAL dv(ip1jm,llm),du(ip1jmp1,llm)
    93 !      REAL dh(ip1jmp1,llm),dp(ip1jmp1)
    9487      REAL phi(iip1,jjp1,llm)
    9588
     
    10699      REAL tsurf(ngridmx)        ! surface temperature
    107100      REAL,ALLOCATABLE :: tsoil(:,:) ! soil temperature
    108 !      REAL n2ice(ngridmx)        ! N2 ice layer
    109101      REAL emis(ngridmx)        ! surface emissivity
    110102      real emisread             ! added by RW
    111103      REAL,ALLOCATABLE :: qsurf(:,:)
     104      REAL,ALLOCATABLE :: qsurf_tmp(:,:)
    112105      REAL q2(ngridmx,llm+1)
    113 !      REAL rnaturfi(ngridmx)
    114106      real alb(iip1,jjp1),albfi(ngridmx) ! albedos
    115107      real,ALLOCATABLE :: ith(:,:,:),ithfi(:,:) ! thermal inertia (3D)
    116108      real surfith(iip1,jjp1),surfithfi(ngridmx) ! surface thermal inertia (2D)
    117 !      REAL latfi(ngridmx),lonfi(ngridmx),airefi(ngridmx)
    118 
    119       INTEGER i,j,l,isoil,ig,idum
     109      REAL :: latfi(ngridmx),lonfi(ngridmx),airefi(ngridmx)
     110
     111      INTEGER i,j,l,isoil,ig,idum,k
    120112      real mugaz ! molar mass of the atmosphere
    121113
    122       integer ierr,iref
     114      integer ierr
    123115
    124116c Variables on the new grid along scalar points
    125117c------------------------------------------------------
    126 !      REAL p(iip1,jjp1)
    127118      REAL t(iip1,jjp1,llm)
    128119      REAL tset(iip1,jjp1,llm)
    129120      real phisold_newgrid(iip1,jjp1)
     121      real phisold(iip1,jjp1)
    130122      REAL :: teta(iip1, jjp1, llm)
    131123      REAL :: pk(iip1,jjp1,llm)
     
    135127      REAL :: xpn,xps,xppn(iim),xpps(iim)
    136128      REAL :: p3d(iip1, jjp1, llm+1)
    137 !      REAL dteta(ip1jmp1,llm)
    138129
    139130c Variable de l'ancienne grille
     
    145136c variables diverses
    146137c-------------------
    147       real choix_1,pp
     138      real choix_1,pp,choice
    148139      character*80      fichnom
    149140      character*250  filestring
     
    153144      real tsud,albsud,alb_bb,ith_bb,Tiso,Tabove
    154145      real ptoto,pcap,patm,airetot,ptotn,patmn,psea
    155 !      real ssum
    156146      character*1 yes
    157147      logical :: flagtset=.false. ,  flagps0=.false.
    158       real val, val2, val3, val4 ! to store temporary variables
     148      real val, val1, val2, val3, val4, dist, ref ! to store temporary variables
     149      real val5, val6, val7, val8, val9, val10,val11, val12 ! to store temporary variables
    159150      real :: iceith=2000 ! thermal inertia of subterranean ice
     151      integer :: iref,jref,iref1,jref1,iref2,jref2
     152      integer :: igref,igref1,igref2,igref3
    160153
    161154      INTEGER :: itau
     
    174167      real fact2
    175168
     169c Special Pluto Map from Lellouch & Grundy
     170c------------------------------------------
     171       integer,parameter :: im_plu=360 ! from topo
     172       integer,parameter :: jm_plu=180   
     173       real latv_plu(jm_plu+1),lonu_plu(im_plu+1)
     174       real map_pluto_dat(im_plu,jm_plu+1)
     175
     176       real N2_pluto_dat(im_plu,jm_plu+1)
     177       real CH4_pluto_dat(im_plu,jm_plu+1)
     178       real CO_pluto_dat(im_plu,jm_plu+1)
     179       real alb_dat(im_plu,jm_plu+1)
     180
     181       real N2_pluto_rein(im_plu+1,jm_plu+1)
     182       real CH4_pluto_rein(im_plu+1,jm_plu+1)
     183       real CO_pluto_rein(im_plu+1,jm_plu+1)
     184       real alb_rein(im_plu+1,jm_plu+1)
     185       real N2_pluto_gcm(iip1,jjp1)
     186       real CH4_pluto_gcm(iip1,jjp1)
     187       real CO_pluto_gcm(iip1,jjp1)
     188       real alb_gcm(iip1,jjp1)
     189
     190c Special Topo Map mountain
     191       real lat0, lon0
     192       integer ig0
     193       real dist_pluto
     194       real radm,height, phisprev, temp
     195       real preffnew,panew
     196c Special copy of terrain
     197       real actualmin,angle
     198       integer array_ind(ngridmx)
     199       real array_dist(ngridmx)
     200       real array_angle(ngridmx)
    176201
    177202c sortie visu pour les champs dynamiques
    178 c---------------------------------------
    179 !      INTEGER :: visuid
    180 !      real :: time_step,t_ops,t_wrt
    181 !      CHARACTER*80 :: visu_file
    182       !TB24
    183203      CALL conf_gcm( 99, .TRUE. )
    184204
    185 
    186205      cpp    = 0.
    187       preff  = 0.
    188       pa     = 0. ! to ensure disaster rather than minor error if we don`t
     206      preff  = 2.
     207      pa     = 0.2 ! to ensure disaster rather than minor error if we don`t
    189208                  ! make deliberate choice of these values elsewhere.
    190209
     
    204223      allocate(q(iip1,jjp1,llm,nqtot))
    205224      allocate(qsurf(ngridmx,nqtot))
     225      allocate(qsurf_tmp(ngridmx,nqtot))
    206226     
    207227! get value of nsoilmx and allocate corresponding arrays
     
    272292
    273293      endif
    274 
    275294
    276295c=======================================================================
     
    354373     .        nqtot,day_ini,time,
    355374     .        tsurf,tsoil,emis,q2,qsurf)    !) ! temporary modif by RDW
    356 !     .        cloudfrac,totalfrac,hice,rnat,pctsrf_sic,tslab,tsea_ice,
    357 !     .        sea_ice)
    358375
    359376        ! copy albedo and soil thermal inertia on (local) physics grid
     
    432449      endif
    433450
     451c Initialisation coordonnees /aires
     452c -------------------------------
     453! Note: rlatu(:) and rlonv(:) are commons defined in "comgeom.h"
     454!       rlatu() and rlonv() are given in radians
     455      latfi(1)=rlatu(1)
     456      lonfi(1)=0.
     457      DO j=2,jjm
     458         DO i=1,iim
     459            latfi((j-2)*iim+1+i)=rlatu(j)
     460            lonfi((j-2)*iim+1+i)=rlonv(i)
     461         ENDDO
     462      ENDDO
     463      latfi(ngridmx)=rlatu(jjp1)
     464      lonfi(ngridmx)=0.
     465
     466      CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,aire,airefi)
     467
    434468      rad = p_rad
    435469      omeg = p_omeg
     
    438472      mugaz = p_mugaz
    439473      daysec = p_daysec
    440 
    441       if (p_omeg .eq. -9999.) then
    442         p_omeg = 8.*atan(1.)/p_daysec
    443         print*,"new value of omega",p_omeg
    444       endif
    445 
    446474      kappa = 8.314*1000./(p_mugaz*p_cpp) ! added by RDW
    447475
     
    536564      endif ! of if (choix_1.eq.0)
    537565
    538 
    539566c=======================================================================
    540567c  Lecture des fichiers (start ou start_archive)
     
    549576     &   surfith,nid)
    550577
    551 !     &   rnat,pctsrf_sic,tslab,tsea_ice,sea_ice)
    552 ! TB24     &   du_nonoro_gwd,dv_nonoro_gwd,east_gwstress,west_gwstress)
    553578        write(*,*) "OK, read start_archive file"
    554579        ! copy soil thermal inertia
     
    572597      do ! infinite loop on list of changes
    573598
    574       write(*,*)
    575       write(*,*)
    576       write(*,*) 'List of possible changes :'
    577       write(*,*) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    578       write(*,*)
    579       write(*,*) 'flat : no topography ("aquaplanet")'
    580       write(*,*) 'set_ps_to_preff : used if changing preff with topo'
    581       write(*,*) 'qname : change tracer name'
    582       write(*,*) 't=profile  : read temperature profile in profile.in'
    583       write(*,*) 'q=0 : ALL tracer =zero'
    584       write(*,*) 'q=x : give a specific uniform value to one tracer'
    585       write(*,*) 'qs=x : give a uniform value to a surface tracer'
    586       write(*,*) 'q=profile    : specify a profile for a tracer'
    587       write(*,*) 'subsoil_all : set seasonal subsurface thermal inertia'
    588       write(*,*) 'diurnal_TI : set diurnal subsurface thermal inertia'
     599        write(*,*)
     600        write(*,*)
     601        write(*,*) 'List of possible changes :'
     602        write(*,*) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
     603        write(*,*)
     604        write(*,*) 'flat : no topography ("aquaplanet")'
     605        write(*,*) 'set_ps_to_preff : used if changing preff with topo'
     606        write(*,*) 'qname : change tracer name'
     607        write(*,*) 't=profile  : read temperature profile in profile.in'
     608        write(*,*) 'q=0 : ALL tracer =zero'
     609        write(*,*) 'q=x : give a specific uniform value to one tracer'
     610        write(*,*) 'qs=x : give a uniform value to a surface tracer'
     611        write(*,*) 'q=profile    : specify a profile for a tracer'
     612        write(*,*) 'qnogcm: initial tracer for GCM from nogcm (CH4,CO)'
     613        write(*,*) 'isotherm : Isothermal Temperatures'
     614        write(*,*) 'tempprof : specific Temperature profile'
     615        write(*,*) 'initsoil : initialize soil Temperatures'
     616        write(*,*) 'ptot : change total pressure'
     617        write(*,*) 'therm_ini_s: set soil TI to reference surf. values'
     618        write(*,*) 'inert3d: give uniform value of thermal inertia'
     619        write(*,*) 'subsoilice_n: put deep underground ice in N. hemis'
     620        write(*,*) 'subsoilice_s: put deep underground ice in S. hemis'
     621        write(*,*) 'reservoir: increase/decrease reservoir of ice'
     622        write(*,*) 'reservoir_SP: increase/decrease reservoir in SP'
     623        write(*,*) 'plutomap: initialize surface like pluto from ...'
     624        write(*,*) 'subsoil_n2: diu-sea thermal inertia for N2 only'
     625        write(*,*) 'subsoil_ch4: diu-sea thermal inertia for CH4 only'
     626        write(*,*) 'subsoil_all: diu-sea thermal inertia for all terr'
     627        write(*,*) 'subsoil_alb: diu-sea thermal inertia from albedo'
     628        write(*,*) 'diurnal_TI: diurnal thermal inertia for all terr'
     629        write(*,*) 'initsurf: initial surface temperature (global)'
     630        write(*,*) 'modtsurf: initial surface temperature (global)'
     631        write(*,*) 'copylat: copy tsurf and tsoil latitude'
     632        write(*,*) 'copylatlon: copy tsurf and tsoil lat/lon'
     633        write(*,*) 'copylon: copy tsurf tsoil lat, n2surf and phisfi'
     634        write(*,*) 'tsurfice: temperature depending on N2 ice'
     635        write(*,*) 'icarus: option to change surface/soil temperature'
     636        write(*,*) 'icarus_ch4: special option to add ch4'
     637        write(*,*) 'delfrostch4: delete ch4 frost'
     638        write(*,*) 'modch4: remove/modify amount ch4 frost'
     639        write(*,*) 'modch4n2: modify amount ch4 frost according N2'
     640        write(*,*) 'modco: remove/modify amount co frost'
     641        write(*,*) 'modn2: remove/modify amount n2 ice'
     642        write(*,*) 'modcoch4: remove/modify co ch4 where no n2 '
     643        write(*,*) 'checktsoil: change tsoil where no n2 '
     644        write(*,*) 'non2noco: if no n2, no co '
     645        write(*,*) 'modn2_topo: modify n2 ice topo according to topo'
     646        write(*,*) 'modwheren2: modify n2 where already n2'
     647        write(*,*) 'modn2HD: modify n2 for HD runs'
     648        write(*,*) 'modn2HD_SP: modify n2 for HD runs in SP'
     649        write(*,*) 'globch4co: add/remove global amount ch4co frost'
     650        write(*,*) 'source_ch4: add source ch4'
     651        write(*,*) 'nomountain: remove pluto mountains (!)'
     652        write(*,*) 'relief: add pluto crater or mountain'
     653        write(*,*) 'seticeNH: set ice for initial start with NH topo'
     654        write(*,*) 'topo_sp: change topography of SP'
     655        write(*,*) 'fill_sp: fill sp with N2 ice and adjust phisfi'
     656        write(*,*) 'fill_sp_inv: fill inverted sp and adjust'
     657        write(*,*) 'subsoil_SP: diu-sea thermal inertia for SP '
     658        write(*,*) 'bladed: add ch4 on bladed terrains'
     659        write(*,*) 'cpbladed: add extension bladed terrains'
     660        write(*,*) 'slope: add slope over all long. (for triton)'
     661        write(*,*) 'digsp: specific to dig SP'
     662        write(*,*) 'bugn2: correct bug of warm n2 due to HighRes'
     663        write(*,*) 'bugch4: correct bug of warm ch4 due to HighRes'
     664        write(*,*) 'flatnosp : topo flat except SP (topo controled)'
     665        write(*,*) 'flatregion: topo flat for specific region'
     666        write(*,*) 'changetopo: change topo'
     667        write(*,*) 'asymtopo: N-S asym topo in tanh'
     668        write(*,*) 'corrtopo: correction topo bug'
     669        write(*,*) 'adjustphi: adjust phisfi according to N2 mass'
     670        write(*,*) 'correctphi: adjust phisfi'
     671        write(*,*) 'correctps: test to correct ps'
     672        write(*,*) 'toponoise: no flat topo'
     673        write(*,*) 'asymtriton: asymetry in longitude for triton'
     674        write(*,*) 'copytsoil: copy 2D tsoil field from nc file'
     675        write(*,*) 'albedomap: read in an albedomap albedo.nc'
     676        write(*,*) 'mod_distrib_ice: modify ice distrib. from albedo'
     677     
     678        write(*,*)
     679        write(*,*) 'Please note that emis and albedo are set in physiq'
     680        write(*,*)
    589681
    590682        write(*,*)
     
    825917             endif
    826918
    827 
    828 
    829 c       subsoil_all : initialize subsurface thermal inertia
    830 c       --------------------------------------------------
    831         else if (modif(1:len_trim(modif)) .eq. 'subsoil_all') then
    832 
    833           write(*,*) 'New value for subsoil thermal inertia  ?'
    834  104      read(*,*,iostat=ierr) ith_bb
    835           if(ierr.ne.0) goto 104
    836           write(*,*) 'thermal inertia (new value):',ith_bb
    837 
    838           write(*,*)'At which depth (in m.) does the ice layer begin?'
    839           write(*,*)'(here, the deepest soil layer extends down to:'
    840      &              ,layer(1),' - ',layer(nsoilmx),')'
    841           write(*,*)'write 0 for uniform value for all subsurf levels?'
    842           ierr=1
    843           do while (ierr.ne.0)
    844            read(*,*,iostat=ierr) val2
    845            write(*,*)'val2 in subsoil_all:',val2,'ierr=',ierr
    846            if (ierr.eq.0) then ! got a value, but do a sanity check
    847              if(val2.gt.layer(nsoilmx)) then
    848                write(*,*)'Depth should be less than ',layer(nsoilmx)
     919c       qnogcm : initialise tracer from nogcm (CH4, CO) 
     920c       --------------------------------
     921        else if (modif(1:len_trim(modif)).eq.'qnogcm') then
     922             write(*,*) 'Which tracer do you want to modify ?'
     923             write(*,*) 'Should be ch4_gas and co_gas'
     924             do iq=1,nqtot
     925               write(*,*)iq,' : ',trim(noms(iq)),' : ',q(1,1,1,iq)
     926             enddo
     927             write(*,*) '(choose between 1 and ',nqtot,')'
     928             read(*,*) iq
     929             DO l=1,llm
     930               DO j=1,jjp1
     931                  DO i=1,iip1
     932                    q(i,j,l,iq)=q(i,j,1,iq)
     933                  ENDDO
     934               ENDDO
     935             ENDDO
     936
     937c       isothermal temperatures
     938c       ------------------------------------------------
     939        else if (modif(1:len_trim(modif)) .eq. 'isotherm') then
     940
     941          write(*,*)'Isothermal temperature of the atmosphere'
     942          write(*,*) 'Value of THIS temperature ? :'
     943 203      read(*,*,iostat=ierr) Tset(1,1,1)
     944          if(ierr.ne.0) goto 203
     945          flagtset=.true.
     946          DO l=1,llm
     947               DO j=1,jjp1
     948                  DO i=1,iip1
     949                    Tset(i,j,l)=Tset(1,1,1)
     950                  ENDDO
     951               ENDDO
     952          ENDDO
     953          write(*,*) 'atmospheric temp =', Tset(2,2,2)
     954
     955c       specific temperature profile
     956c       ------------------------------------------------
     957        else if (modif(1:len_trim(modif)) .eq. 'tempprof') then
     958
     959          write(*,*) 'phi='
     960          write(*,*) phi(1,1,:)
     961          write(*,*) 'temperature profile in the atmosphere'
     962          write(*,*) 'Value of THIS temperature ? :'
     963 204      read(*,*,iostat=ierr) Tset(1,1,1)
     964          if(ierr.ne.0) goto 204
     965          flagtset=.true.
     966          DO l=1,llm
     967               DO j=1,jjp1
     968                  DO i=1,iip1
     969                    Tset(i,j,l)=Tset(1,1,1)
     970                  ENDDO
     971               ENDDO
     972          ENDDO
     973          write(*,*) 'atmospheric temp =', Tset(2,2,2)
     974
     975c       initsoil: subsurface temperature
     976c       ---------------------------------
     977        else if (modif(1:len_trim(modif)) .eq. 'initsoil') then
     978
     979          write(*,*)'Isothermal temperature of the subsurface'
     980          write(*,*) 'Value of this temperature ? :'
     981 303      read(*,*,iostat=ierr) Tiso
     982          if(ierr.ne.0) goto 303
     983
     984          do l=1,nsoilmx
     985            do ig=1, ngridmx
     986              tsoil(ig,l) = Tiso
     987            end do
     988          end do
     989
     990c       icarus : changing tsoil tsurf on latitudinal bands
     991c       -----------------------------------------------------
     992        else if (modif(1:len_trim(modif)) .eq. 'icarus') then
     993
     994          write(*,*) 'At which lat lon do you want to extract the
     995     &                              reference tsurf/tsoil profile ?'
     996 407      read(*,*,iostat=ierr) val,val2
     997          if(ierr.ne.0) goto 407
     998          write(*,*) 'You want lat =',val
     999          write(*,*) 'You want lon =',val2
     1000          dist=0
     1001          ref=1000
     1002          do j=1,ngridmx-1
     1003                 dist=sqrt((lonfi(j)*180./pi-val2)**2+
     1004     &                              (latfi(j)*180./pi-val)**2)
     1005                 IF (dist.lt.ref) then
     1006                    ref=dist
     1007                    jref=j
     1008                 ENDIF
     1009          ENDDO
     1010
     1011          write(*,*)'Will use nearest grid point which is:',
     1012     &              latfi(jref)*180./pi,lonfi(jref)*180./pi
     1013
     1014          ! Extraction of the profile
     1015          write(*,*) 'Profile is =',tsoil(jref,:)
     1016          write(*,*) 'tsurf is =',tsurf(jref)
     1017          write(*,*) 'Choice lat for latitudinal band with this profile'
     1018 408      read(*,*,iostat=ierr) val3
     1019          if(ierr.ne.0) goto 408
     1020          write(*,*) 'Choice delta lat for this latitudinal band'
     1021 409      read(*,*,iostat=ierr) val4
     1022          if(ierr.ne.0) goto 409
     1023          write(*,*) 'Choice delta temp (K) for this latitudinal band'
     1024 410      read(*,*,iostat=ierr) val5
     1025          if(ierr.ne.0) goto 410
     1026          write(*,*) 'How much N2 ice should I put on this band (kg/m2)'
     1027 415      read(*,*,iostat=ierr) choice
     1028          if(ierr.ne.0) goto 415
     1029          write(*,*) 'Choice lat2'
     1030 411      read(*,*,iostat=ierr) val6
     1031          if(ierr.ne.0) goto 411
     1032          write(*,*) 'Choice delta lat for this latitudinal band'
     1033 412      read(*,*,iostat=ierr) val7
     1034          if(ierr.ne.0) goto 412
     1035          write(*,*) 'Choice delta temp (K) for this latitudinal band'
     1036 413      read(*,*,iostat=ierr) val8
     1037          if(ierr.ne.0) goto 413
     1038
     1039          DO ig=1,ngridmx
     1040             IF (   (latfi(ig)*180./pi.ge.(val3-val4/2.))  .and.
     1041     &              (latfi(ig)*180./pi.le.(val3+val4/2.))  .and.
     1042     &              (qsurf(ig,igcm_n2).lt.0.001)   )      then
     1043                    tsurf(ig)=tsurf(jref)+val5
     1044                    DO l=1,nsoilmx
     1045                       tsoil(ig,l)=tsoil(jref,l)+val5
     1046                    ENDDO
     1047                    qsurf(ig,igcm_n2)=choice
     1048             ENDIF
     1049             IF (   (latfi(ig)*180./pi.ge.(val6-val7/2.))  .and.
     1050     &              (latfi(ig)*180./pi.le.(val6+val7/2.))  .and.
     1051     &              (qsurf(ig,igcm_n2).lt.0.001)   )      then
     1052                    tsurf(ig)=tsurf(jref)+val8
     1053                    DO l=1,nsoilmx
     1054                       tsoil(ig,l)=tsoil(jref,l)+val8
     1055                    ENDDO
     1056             ENDIF
     1057          ENDDO
     1058
     1059c       icarus_ch4 : changing tsoil tsurf and adding ch4
     1060c       -----------------------------------------------------
     1061        else if (modif(1:len_trim(modif)) .eq. 'icarus_ch4') then
     1062
     1063          write(*,*) 'At which lat lon do you want to extract the
     1064     &                              reference tsurf/tsoil profile ?'
     1065 416      read(*,*,iostat=ierr) val,val2
     1066          if(ierr.ne.0) goto 416
     1067          write(*,*) 'You want lat =',val
     1068          write(*,*) 'You want lon =',val2
     1069          dist=0
     1070          ref=1000
     1071          do j=1,ngridmx-1
     1072                 dist=sqrt((lonfi(j)*180./pi-val2)**2+
     1073     &                              (latfi(j)*180./pi-val)**2)
     1074                 IF (dist.lt.ref) then
     1075                    ref=dist
     1076                    jref=j
     1077                 ENDIF
     1078          ENDDO
     1079
     1080          write(*,*)'Will use nearest grid point which is:',
     1081     &              latfi(jref)*180./pi,lonfi(jref)*180./pi
     1082
     1083          ! Extraction of the profile
     1084          write(*,*) 'Profile is =',tsoil(jref,:)
     1085          write(*,*) 'tsurf is =',tsurf(jref)
     1086          write(*,*) 'Choice band : lat1 and lat2 ?'
     1087 417      read(*,*,iostat=ierr) val3,val4
     1088          if(ierr.ne.0) goto 417
     1089          write(*,*) 'Choice temp coefficient for this latitudinal band'
     1090 418      read(*,*,iostat=ierr) val5
     1091          if(ierr.ne.0) goto 418
     1092          write(*,*) 'How much CH4 ice do I put on this band (kg/m2)'
     1093 419      read(*,*,iostat=ierr) choice
     1094          if(ierr.ne.0) goto 419
     1095
     1096          DO ig=1,ngridmx
     1097             IF (   (latfi(ig)*180./pi.ge.val3)  .and.
     1098     &              (latfi(ig)*180./pi.le.val4)  .and.
     1099     &              (qsurf(ig,igcm_ch4_ice).lt.0.001) )      then
     1100                    tsurf(ig)=tsurf(jref)*val5
     1101                    DO l=1,nsoilmx
     1102                       tsoil(ig,l)=tsoil(jref,l)*val5
     1103                    ENDDO
     1104                    qsurf(ig,igcm_ch4_ice)=choice
     1105             ENDIF
     1106          ENDDO
     1107
     1108c       globch4co : adding/remove global ch4 co
     1109c       ----------------------------------------------------------
     1110        else if (modif(1:len_trim(modif)) .eq. 'globch4co') then
     1111
     1112          write(*,*) 'Adding or removing ch4 co '
     1113          write(*,*) 'Choice amount add/less ch4 ice (0 = rm all)'
     1114 431      read(*,*,iostat=ierr) val3
     1115          if(ierr.ne.0) goto 431
     1116          write(*,*) 'Choice amount add/less co ice (0 = rm all)'
     1117 432      read(*,*,iostat=ierr) val4
     1118          if(ierr.ne.0) goto 432
     1119          IF (val3.eq.0.) then
     1120             DO ig=1,ngridmx
     1121                    qsurf(ig,igcm_ch4_ice)=0.
     1122             ENDDO
     1123          ELSE
     1124             DO ig=1,ngridmx
     1125                    qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)+val3
     1126             ENDDO
     1127          ENDIF
     1128          IF (val4.eq.0.) then
     1129             DO ig=1,ngridmx
     1130                    qsurf(ig,igcm_co_ice)=0.
     1131             ENDDO
     1132          ELSE
     1133             DO ig=1,ngridmx
     1134                    qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)+val4
     1135             ENDDO
     1136          ENDIF
     1137 
     1138c       bladed : adding/remove ch4 on bladed terrains
     1139c       ----------------------------------------------------------
     1140        else if (modif(1:len_trim(modif)).eq.'bladed') then
     1141
     1142          write(*,*) 'Adding or removing ch4 on the bladed terrains'
     1143          write(*,*) 'Choice band : lat1 and lat2 ?'
     1144 450      read(*,*,iostat=ierr) val,val2
     1145          if(ierr.ne.0) goto 450
     1146          write(*,*) 'Choice band : lon1 and lon2 ?'
     1147 451      read(*,*,iostat=ierr) val3,val4
     1148          if(ierr.ne.0) goto 451
     1149          write(*,*) 'Choice phisfi minimum ?'
     1150 454      read(*,*,iostat=ierr) choice
     1151          if(ierr.ne.0) goto 454
     1152          write(*,*) 'Choice multiplicative factor'
     1153 452      read(*,*,iostat=ierr) val5
     1154          if(ierr.ne.0) goto 452
     1155          write(*,*) 'Choice additional ch4'
     1156 453      read(*,*,iostat=ierr) val6
     1157          if(ierr.ne.0) goto 453
     1158          write(*,*) 'Choice index for tsurf tsoil'
     1159 449      read(*,*,iostat=ierr) iref
     1160          if(ierr.ne.0) goto 449
     1161
     1162          ! shift
     1163          DO ig=1,ngridmx
     1164             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1165     &              (latfi(ig)*180./pi.le.val2)  .and.
     1166     &              (lonfi(ig)*180./pi.ge.val3)  .and.
     1167     &              (lonfi(ig)*180./pi.le.val4)  .and.
     1168     &              (phisfi(ig).gt.choice) )  then     
     1169               qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)*val5
     1170               qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)+val6
     1171               tsurf(ig)=tsurf(iref)
     1172               DO l=1,nsoilmx
     1173                  tsoil(ig,l)=tsoil(iref,l)
     1174               ENDDO
     1175             ENDIF
     1176          ENDDO
     1177
     1178c       cpbladed : add extension bladed terrains
     1179c       ----------------------------------------------------------
     1180        else if (modif(1:len_trim(modif)).eq.'cpbladed') then
     1181
     1182          write(*,*) 'Choice lat,lon, centre of band to be copied ?'
     1183 560      read(*,*,iostat=ierr) val,val2
     1184          if(ierr.ne.0) goto 560
     1185          write(*,*) 'Choice distance (km) from there defining the area'
     1186 561      read(*,*,iostat=ierr) val3
     1187          if(ierr.ne.0) goto 561
     1188          write(*,*) 'Nb of copies ?'
     1189 562      read(*,*,iostat=ierr) l
     1190          if(ierr.ne.0) goto 562
     1191
     1192          ! Get index correponding to central points 
     1193          ! 1/ Reference point
     1194          igref=1
     1195          actualmin=1000.
     1196          do ig=1,ngridmx
     1197               val6=dist_pluto(latfi(ig),lonfi(ig),
     1198     &                              val*pi/180.,val2*pi/180.)
     1199               if (val6.lt.actualmin) then
     1200                   actualmin=val6
     1201                   igref=ig
     1202               endif
     1203          enddo
     1204
     1205          do k=1,l
     1206
     1207            write(*,*) 'Choice lat,lon where terrain is copied'
     1208 563        read(*,*,iostat=ierr) val4,val5
     1209            if(ierr.ne.0) goto 563
     1210         
     1211            if (val5.gt.180.) then
     1212              val5=val5-360.
     1213            endif
     1214
     1215            ! 2/ Target point
     1216            igref2=1
     1217            actualmin=1000.
     1218            do ig=1,ngridmx
     1219               val6=dist_pluto(latfi(ig),lonfi(ig),
     1220     &                              val4*pi/180.,val5*pi/180.)
     1221               if (val6.lt.actualmin) then
     1222                   actualmin=val6
     1223                   igref2=ig
     1224               endif
     1225            enddo
     1226
     1227            ! for each point within A1, get distance and angle
     1228            ! save in a table
     1229            i=1
     1230            array_ind(:)=0
     1231            array_dist(:)=1000.
     1232            array_angle(:)=0.
     1233            do ig=1,ngridmx
     1234               val6=dist_pluto(latfi(ig),lonfi(ig),
     1235     &                              val*pi/180.,val2*pi/180.)
     1236               if (val6.lt.val3) then
     1237                array_ind(i)=ig
     1238                array_dist(i)=val6
     1239                array_angle(i)=atan2(val-latfi(ig)*180./pi,
     1240     &                              val2-lonfi(ig)*180./pi)
     1241                i=i+1
     1242               endif
     1243            enddo
     1244
     1245          ! for each point within A2, get distance and angle
     1246          ! and look where fit with previous table, and set value
     1247
     1248            do ig=1,ngridmx
     1249               val6=dist_pluto(latfi(ig),lonfi(ig),
     1250     &                              val4*pi/180.,val5*pi/180.)
     1251               if (val6.lt.val3) then
     1252                ! dist = val6
     1253                ! get angle:
     1254                angle=atan2(val4-latfi(ig)*180./pi,
     1255     &                              val5-lonfi(ig)*180./pi)
     1256                ! Loop where min
     1257                actualmin=1000.
     1258                do j=1,i
     1259                   if ( (array_angle(j).lt.angle+0.52).and.
     1260     &                  (array_angle(j).gt.angle-0.52).and.
     1261     &                  (array_dist(j)-val6.lt.actualmin) ) then
     1262                        actualmin=array_dist(j)-val6
     1263                        igref3=j
     1264                   endif
     1265                enddo
     1266                phisfi(ig)=phisfi(array_ind(igref3))
     1267                qsurf(ig,igcm_ch4_ice)=
     1268     &                         qsurf(array_ind(igref3),igcm_ch4_ice)
     1269                tsurf(ig)=tsurf(array_ind(igref3))
     1270               endif
     1271            enddo
     1272          enddo
     1273          CALL gr_fi_dyn(1,ngridmx,iip1,jjp1,phisfi,phis)
     1274
     1275c       delfrostch4/ delete ch4 frost on a latitudinal band
     1276c       ----------------------------------------------------------
     1277        else if (modif(1:len_trim(modif)) .eq. 'delfrostch4') then
     1278
     1279          write(*,*) 'removing ch4 latitudinally'
     1280          write(*,*) 'Choice band : lat1 and lat2 ?'
     1281          read(*,*,iostat=ierr) val,val2
     1282          write(*,*) 'Choice band : lon1 and lon2 ?'
     1283 522      read(*,*,iostat=ierr) val4,val5
     1284          if(ierr.ne.0) goto 522
     1285          write(*,*) 'Choice amount max below whcih ch4 is removed'
     1286 521      read(*,*,iostat=ierr) val3
     1287          if(ierr.ne.0) goto 521
     1288
     1289          DO ig=1,ngridmx
     1290             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1291     &              (latfi(ig)*180./pi.le.val2)  .and.
     1292     &              (lonfi(ig)*180./pi.ge.val4)  .and.
     1293     &              (lonfi(ig)*180./pi.lt.val5) .and.
     1294     &              (qsurf(ig,igcm_ch4_ice).lt.val3) )      then
     1295                    qsurf(ig,igcm_ch4_ice)=0.
     1296             ENDIF
     1297          ENDDO
     1298
     1299c       modch4 : adding/remove ch4 frost on a latitudinal band
     1300c       ----------------------------------------------------------
     1301        else if (modif(1:len_trim(modif)) .eq. 'modch4') then
     1302
     1303          write(*,*) 'Adding or removing ch4 latitudinally'
     1304          write(*,*) 'Choice band : lat1 and lat2 ?'
     1305          read(*,*,iostat=ierr) val,val2
     1306          write(*,*) 'Choice band : lon1 and lon2 ?'
     1307 422      read(*,*,iostat=ierr) val4,val5
     1308          if(ierr.ne.0) goto 422
     1309          write(*,*) 'Choice multiplicative factor'
     1310 421      read(*,*,iostat=ierr) val3
     1311          if(ierr.ne.0) goto 421
     1312          write(*,*) 'Choice additional ch4'
     1313 423      read(*,*,iostat=ierr) val6
     1314          if(ierr.ne.0) goto 423
     1315
     1316          DO ig=1,ngridmx
     1317             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1318     &              (latfi(ig)*180./pi.le.val2)  .and.
     1319     &              (lonfi(ig)*180./pi.ge.val4)  .and.
     1320     &              (lonfi(ig)*180./pi.lt.val5)) then
     1321!     &              (qsurf(ig,igcm_n2).gt.50))  then     
     1322!     &              (qsurf(ig,igcm_ch4_ice).lt.10) )      then
     1323                    qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)*val3
     1324                    qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)+val6
     1325             ENDIF
     1326          ENDDO
     1327
     1328c       modch4n2 : adding/remove ch4 frost on a latitudinal band
     1329c       ----------------------------------------------------------
     1330        else if (modif(1:len_trim(modif)) .eq. 'modch4n2') then
     1331
     1332          write(*,*) 'Adding or removing ch4 latitudinally'
     1333          write(*,*) 'Choice band : lat1 and lat2 ?'
     1334          read(*,*,iostat=ierr) val,val2
     1335          write(*,*) 'Choice band : lon1 and lon2 ?'
     1336          read(*,*,iostat=ierr) val4,val5
     1337          write(*,*) 'Choice range n2 for modif'
     1338          read(*,*,iostat=ierr) val7,val8
     1339          write(*,*) 'Choice multiplicative factor ch4'
     1340          read(*,*,iostat=ierr) val3
     1341          write(*,*) 'Choice additional ch4'
     1342          read(*,*,iostat=ierr) val6
     1343
     1344          DO ig=1,ngridmx
     1345             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1346     &              (latfi(ig)*180./pi.le.val2)  .and.
     1347     &              (lonfi(ig)*180./pi.ge.val4)  .and.
     1348     &              (lonfi(ig)*180./pi.lt.val5) .and.
     1349     &              (qsurf(ig,igcm_n2).gt.val7)  .and.     
     1350     &              (qsurf(ig,igcm_n2).lt.val8) )      then
     1351                    qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)*val3
     1352                    qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)+val6
     1353             ENDIF
     1354          ENDDO
     1355
     1356c       non2noco : if no n2 no co
     1357c       ----------------------------------------------------------
     1358        else if (modif(1:len_trim(modif)) .eq. 'non2noco') then
     1359          DO ig=1,ngridmx
     1360             IF (   (qsurf(ig,igcm_n2).lt.0.001))  then     
     1361                    qsurf(ig,igcm_co_ice)=0.
     1362             ENDIF
     1363          ENDDO
     1364
     1365c       modco : adding/remove co frost on a latitudinal band
     1366c       ----------------------------------------------------------
     1367        else if (modif(1:len_trim(modif)) .eq. 'modco') then
     1368
     1369          write(*,*) 'Adding or removing co where N2 is present '
     1370          write(*,*) 'Choice limit mini n2 pour mettre co?'
     1371 460      read(*,*,iostat=ierr) val7
     1372          if(ierr.ne.0) goto 460
     1373          write(*,*) 'Choice band : lat1 and lat2 ?'
     1374 461      read(*,*,iostat=ierr) val,val2
     1375          if(ierr.ne.0) goto 461
     1376          write(*,*) 'Choice band : lon1 and lon2 ?'
     1377 462      read(*,*,iostat=ierr) val4,val5
     1378          if(ierr.ne.0) goto 462
     1379          write(*,*) 'Choice multiplicative factor'
     1380 463      read(*,*,iostat=ierr) val3
     1381          if(ierr.ne.0) goto 463
     1382          write(*,*) 'Choice additional co'
     1383 464      read(*,*,iostat=ierr) val6
     1384          if(ierr.ne.0) goto 464
     1385
     1386          DO ig=1,ngridmx
     1387             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1388     &              (latfi(ig)*180./pi.le.val2)  .and.
     1389     &              (lonfi(ig)*180./pi.ge.val4)  .and.
     1390     &              (lonfi(ig)*180./pi.lt.val5)  .and.
     1391     &              (qsurf(ig,igcm_n2).lt.val7))  then     
     1392                    qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)*val3
     1393                    qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)+val6
     1394             ENDIF
     1395          ENDDO
     1396
     1397c       modn2 : adding/remove n2 ice
     1398c       ----------------------------------------------------------
     1399        else if (modif(1:len_trim(modif)) .eq. 'modn2') then
     1400
     1401          write(*,*) 'Adding or removing n2 '
     1402          write(*,*) 'Choice band : lat1 and lat2 ?'
     1403 425      read(*,*,iostat=ierr) val,val2
     1404          if(ierr.ne.0) goto 425
     1405          write(*,*) 'Choice band : lon1 and lon2 ?'
     1406 426      read(*,*,iostat=ierr) val4,val5
     1407          if(ierr.ne.0) goto 426
     1408          write(*,*) 'Choice multiplicative factor'
     1409 427      read(*,*,iostat=ierr) val3
     1410          if(ierr.ne.0) goto 427
     1411          write(*,*) 'Choice additional n2'
     1412 428     read(*,*,iostat=ierr) val6
     1413          if(ierr.ne.0) goto 428
     1414
     1415          DO ig=1,ngridmx
     1416             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1417     &              (latfi(ig)*180./pi.le.val2)  .and.
     1418     &              (lonfi(ig)*180./pi.ge.val4)  .and.
     1419     &              (lonfi(ig)*180./pi.lt.val5)  ) then
     1420c    &              (qsurf(ig,igcm_n2).lt.50))  then     
     1421                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)*val3
     1422                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)+val6
     1423             ENDIF
     1424!             IF ((phisfi(ig).gt.-1000.)) then
     1425!                qsurf(ig,igcm_n2)=0.
     1426!             ENDIF
     1427          ENDDO
     1428
     1429c       modcoch4 : adding/remove co and ch4 frost where co without n2
     1430c       ----------------------------------------------------------
     1431        else if (modif(1:len_trim(modif)) .eq. 'modcoch4') then
     1432
     1433          write(*,*) 'Adding or removing co where N2 is not present '
     1434          write(*,*) 'Choice band : lat1 and lat2 ?'
     1435 491      read(*,*,iostat=ierr) val,val2
     1436          if(ierr.ne.0) goto 491
     1437          write(*,*) 'Choice band : lon1 and lon2 ?'
     1438 492      read(*,*,iostat=ierr) val4,val5
     1439          if(ierr.ne.0) goto 492
     1440          write(*,*) 'Choice multiplicative factor'
     1441 493      read(*,*,iostat=ierr) val3
     1442          if(ierr.ne.0) goto 493
     1443          write(*,*) 'Choice additional co ch4'
     1444 494      read(*,*,iostat=ierr) val6
     1445          if(ierr.ne.0) goto 494
     1446
     1447          DO ig=1,ngridmx
     1448             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1449     &              (latfi(ig)*180./pi.le.val2)  .and.
     1450     &              (lonfi(ig)*180./pi.ge.val4)  .and.
     1451     &              (lonfi(ig)*180./pi.le.val5)  .and.
     1452     &              (qsurf(ig,igcm_n2).lt.10.))  then     
     1453                    qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)*val3
     1454                    qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)+val6
     1455                    qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)*val3
     1456                    qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)+val6
     1457             ENDIF
     1458          ENDDO
     1459
     1460c       modn2HD : adding/remove n2 ice for HD runs
     1461c       ----------------------------------------------------------
     1462        else if (modif(1:len_trim(modif)) .eq. 'modn2HD') then
     1463
     1464          write(*,*) 'Adding or removing n2 '
     1465          write(*,*) 'Choice band : lat1 and lat2 ?'
     1466 480      read(*,*,iostat=ierr) val,val1
     1467          if(ierr.ne.0) goto 480
     1468          write(*,*) 'Choice band : lon1 and lon2 ?'
     1469 481      read(*,*,iostat=ierr) val2,val3
     1470          if(ierr.ne.0) goto 481
     1471          write(*,*) 'Choice amount N2 min max where to modify'
     1472 482      read(*,*,iostat=ierr) val4,val5
     1473          if(ierr.ne.0) goto 482
     1474          write(*,*) 'Choice phisfi min max where change n2'
     1475 483     read(*,*,iostat=ierr) val6,val11
     1476          if(ierr.ne.0) goto 483
     1477          write(*,*) 'Choice multiplicative factor'
     1478 484      read(*,*,iostat=ierr) val7
     1479          if(ierr.ne.0) goto 484
     1480          write(*,*) 'Choice additional n2'
     1481 485     read(*,*,iostat=ierr) val8
     1482          if(ierr.ne.0) goto 485
     1483!          write(*,*) 'Choice ind lon equivalent for change tsurf tsoil'
     1484! 486     read(*,*,iostat=ierr) val9
     1485!          if(ierr.ne.0) goto 486
     1486
     1487          DO ig=1,ngridmx
     1488             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1489     &              (latfi(ig)*180./pi.le.val1)  .and.
     1490     &              (lonfi(ig)*180./pi.ge.val2)  .and.
     1491     &              (lonfi(ig)*180./pi.lt.val3)  .and.
     1492     &              (qsurf(ig,igcm_n2).ge.val4)  .and.
     1493     &              (qsurf(ig,igcm_n2).lt.val5)  .and.
     1494     &              (phisfi(ig).ge.val6) .and.
     1495     &              (phisfi(ig).le.val11)  ) then
     1496
     1497                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)*val7
     1498                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)+val8
     1499                    !qsurf(ig,igcm_ch4_ice)=0.
     1500                    qsurf(ig,igcm_co_ice)=0.
     1501                    ! index of ig
     1502                    !if (val9.eq.0.) then
     1503                    !   iref=2546
     1504                    !else
     1505                    !   val10=modulo((ig-1),96)
     1506                    !   choice=ig+int(96/2)-val10
     1507                    !   !choice=int(1+96*(val9-1)+val10)
     1508                    !endif
     1509                    !tsurf(ig)=tsurf(iref)
     1510                    !DO l=1,nsoilmx
     1511                    !   tsoil(ig,l)=tsoil(iref,l)
     1512                    !ENDDO
     1513                    tsurf(ig)=tsurf(ig)+4
     1514                    DO l=1,nsoilmx
     1515                       tsoil(ig,l)=tsoil(ig,l)+4
     1516                    ENDDO
     1517             ENDIF
     1518!             IF ((phisfi(ig).gt.-1000.)) then
     1519!                qsurf(ig,igcm_n2)=0.
     1520!             ENDIF
     1521          ENDDO
     1522
     1523c       modn2HD_SP : adding/remove n2 ice for HD runs
     1524c       ----------------------------------------------------------
     1525        else if (modif(1:len_trim(modif)) .eq. 'modn2HD_SP') then
     1526
     1527          write(*,*) 'Adding or removing n2 '
     1528          write(*,*) 'Choice band : lat1 and lat2 ?'
     1529 501      read(*,*,iostat=ierr) val,val1
     1530          if(ierr.ne.0) goto 501
     1531          write(*,*) 'Choice band : lon1 and lon2 ?'
     1532 502      read(*,*,iostat=ierr) val2,val3
     1533          if(ierr.ne.0) goto 502
     1534          write(*,*) 'Choice amount N2 min max where to modify'
     1535 503      read(*,*,iostat=ierr) val4,val5
     1536          if(ierr.ne.0) goto 503
     1537          write(*,*) 'Choice phisfi min max where change n2'
     1538 504     read(*,*,iostat=ierr) val6,val11
     1539          if(ierr.ne.0) goto 504
     1540          write(*,*) 'Choice multiplicative factor'
     1541 505      read(*,*,iostat=ierr) val7
     1542          if(ierr.ne.0) goto 505
     1543          write(*,*) 'Choice additional n2'
     1544 506     read(*,*,iostat=ierr) val8
     1545          if(ierr.ne.0) goto 506
     1546          write(*,*) 'Choice ind lon equivalent for change tsurf tsoil'
     1547 507     read(*,*,iostat=ierr) iref
     1548          if(ierr.ne.0) goto 507
     1549
     1550          DO ig=1,ngridmx
     1551             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1552     &              (latfi(ig)*180./pi.le.val1)  .and.
     1553     &              (lonfi(ig)*180./pi.ge.val2)  .and.
     1554     &              (lonfi(ig)*180./pi.lt.val3)  .and.
     1555     &              (qsurf(ig,igcm_n2).ge.val4)  .and.
     1556     &              (qsurf(ig,igcm_n2).lt.val5)  .and.
     1557     &              (phisfi(ig).ge.val6) .and.
     1558     &              (phisfi(ig).le.val11)  ) then
     1559
     1560                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)*val7
     1561                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)+val8
     1562                    qsurf(ig,igcm_ch4_ice)=0.
     1563                    qsurf(ig,igcm_co_ice)=0.
     1564                    ! index of ig
     1565                    !if (val9.eq.0.) then
     1566                    !   iref=2546
     1567                    !else
     1568                    !val10=modulo((ig-1),96)
     1569                    !choice=ig+int(96/2)-val10
     1570                    !choice=int(1+96*(val9-1)+val10)
     1571                    if (iref.ge.1) then
     1572                     tsurf(ig)=tsurf(iref)
     1573                     DO l=1,nsoilmx
     1574                        tsoil(ig,l)=tsoil(iref,l)
     1575                     ENDDO
     1576                    else if (iref.eq.0) then
     1577                     choice=int(ig/96.)*96+84
     1578                     print*, 'choice=',choice
     1579                     tsurf(ig)=tsurf(int(choice))
     1580                     DO l=1,nsoilmx
     1581                        tsoil(ig,l)=tsoil(int(choice),l)
     1582                     ENDDO
     1583                    endif
     1584             ENDIF
     1585          ENDDO
     1586
     1587
     1588c       modn2_topo : adding/remove n2 ice
     1589c       ----------------------------------------------------------
     1590        else if (modif(1:len_trim(modif)) .eq. 'modn2_topo') then
     1591
     1592          write(*,*) 'Adding or removing n2 '
     1593          write(*,*) 'Choice band : lat1 and lat2 ?'
     1594 441      read(*,*,iostat=ierr) val,val2
     1595          if(ierr.ne.0) goto 441
     1596          write(*,*) 'Choice band : lon1 and lon2 ?'
     1597 442      read(*,*,iostat=ierr) val4,val5
     1598          if(ierr.ne.0) goto 442
     1599          write(*,*) 'Choice topo 1 et 2 (phi) where change is active'
     1600 443      read(*,*,iostat=ierr) val7,val8
     1601          if(ierr.ne.0) goto 443
     1602          write(*,*) 'Choice multiplicative factor'
     1603 444      read(*,*,iostat=ierr) val3
     1604          if(ierr.ne.0) goto 444
     1605          write(*,*) 'Choice additional n2'
     1606 445     read(*,*,iostat=ierr) val6
     1607          if(ierr.ne.0) goto 445
     1608
     1609          DO ig=1,ngridmx
     1610             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1611     &              (latfi(ig)*180./pi.le.val2)  .and.
     1612     &              (lonfi(ig)*180./pi.ge.val4)  .and.
     1613     &              (lonfi(ig)*180./pi.lt.val5)  .and.
     1614     &              (phisfi(ig).le.val8) .and.
     1615     &              (phisfi(ig).ge.val7)   ) then
     1616                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)*val3
     1617                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)+val6
     1618             ENDIF
     1619          ENDDO
     1620
     1621c       modwheren2 : adding/remove n2 ice where already n2
     1622c       ----------------------------------------------------------
     1623        else if (modif(1:len_trim(modif)) .eq. 'modwheren2') then
     1624
     1625          write(*,*) 'Choice multiplicative factor'
     1626 471      read(*,*,iostat=ierr) val3
     1627          if(ierr.ne.0) goto 471
     1628          write(*,*) 'Choice additional n2'
     1629 472     read(*,*,iostat=ierr) val6
     1630          if(ierr.ne.0) goto 472
     1631
     1632          DO ig=1,ngridmx
     1633             IF (   qsurf(ig,igcm_n2).gt.0.001 ) then
     1634                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)*val3
     1635                    qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)+val6
     1636             ENDIF
     1637          ENDDO
     1638
     1639c       checktsoil : changing tsoil if no n2
     1640c       ----------------------------------------------------------
     1641        else if (modif(1:len_trim(modif)) .eq. 'checktsoil') then
     1642
     1643          write(*,*) 'selecting area where tsoil to be check '
     1644          write(*,*) 'Choice band : lat1 and lat2 ?'
     1645 511      read(*,*,iostat=ierr) val,val1
     1646          if(ierr.ne.0) goto 511
     1647          write(*,*) 'Choice band : lon1 and lon2 ?'
     1648 512      read(*,*,iostat=ierr) val2,val3
     1649          if(ierr.ne.0) goto 512
     1650          write(*,*) 'Choice temp min max in which change is made'
     1651 513      read(*,*,iostat=ierr) val4,val5
     1652          if(ierr.ne.0) goto 513
     1653          write(*,*) 'Choice phisfi min max where change n2'
     1654 514     read(*,*,iostat=ierr) val6,val11
     1655          if(ierr.ne.0) goto 514
     1656
     1657          DO ig=1,ngridmx
     1658             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1659     &              (latfi(ig)*180./pi.le.val1)  .and.
     1660     &              (lonfi(ig)*180./pi.ge.val2)  .and.
     1661     &              (lonfi(ig)*180./pi.le.val3)  .and.
     1662     &              (((tsurf(ig).ge.val4)  .and.
     1663     &              (tsurf(ig).le.val5)) .or.
     1664     &              ((tsoil(ig,nsoilmx).ge.val4)  .and.
     1665     &              (tsoil(ig,nsoilmx).le.val5))) .and.
     1666     &              (phisfi(ig).ge.val6) .and.
     1667     &              (phisfi(ig).le.val11) .and.
     1668     &              (qsurf(ig,igcm_n2).le.0.001) ) then
     1669
     1670!                    DO i=1,ngridmx
     1671!                       IF (   (latfi(i).eq.latfi(ig))  .and.
     1672!     &              (lonfi(i).eq.0.) ) then
     1673!
     1674                         tsurf(ig)=50.
     1675                         !qsurf(ig,igcm_ch4_ice)=qsurf(i,igcm_ch4_ice)
     1676!
     1677                         DO l=1,nsoilmx
     1678                           tsoil(ig,l)=50. !tsoil(i,l)
     1679                         ENDDO
     1680                       !ENDIF
     1681                    !ENDDO
     1682             ENDIF
     1683          ENDDO
     1684
     1685c       asymtriton : changing ice, tsurf and tsoil on triton
     1686c       ----------------------------------------------------------
     1687        else if (modif(1:len_trim(modif)) .eq. 'asymtriton') then
     1688
     1689          write(*,*) 'selecting area where tsoil to be check '
     1690          write(*,*) 'Choice center latitude of sinuisoid distrib?'
     1691 531      read(*,*,iostat=ierr) val1
     1692          if(ierr.ne.0) goto 531
     1693          write(*,*) 'Choice maginutde in latitude?'
     1694 532      read(*,*,iostat=ierr) val2
     1695          if(ierr.ne.0) goto 532
     1696          write(*,*) 'Choice center longitude?'
     1697 533      read(*,*,iostat=ierr) val3
     1698          if(ierr.ne.0) goto 533
     1699!          write(*,*) 'iip1,jjp1=',iip1,jjp1,ngridmx
     1700
     1701          DO ig=1,ngridmx
     1702             ! Latitude of the sinusoid:
     1703             val11=val1+val2*cos(lonfi(ig)*1.57079633*2/pi-val3*pi/180.)
     1704             ! If above line and ice: remove ice
     1705             IF ( (latfi(ig)*180./pi.ge.val11) .and.
     1706     &             (latfi(ig)*180./pi.le.val1+val2) .and.
     1707     &             (qsurf(ig,igcm_n2).gt.0.) ) then
     1708               ! Look for same longitude point where no ice           
     1709               val5=1.
     1710               jref=ig
     1711               ! 1
     1712               ! ... iip1 ... x (jjp1-2)     32 x 23
     1713               ! 1
     1714               do while (val5.ge.1..and.jref.gt.iip1)
     1715                  ! northward point
     1716                  jref=jref-iip1+1
     1717                  ! ice at the point
     1718                  val5=qsurf(jref,igcm_n2)
     1719!                 write(*,*) jref,
     1720!     &                   latfi(jref)*180./pi,lonfi(jref)*180/pi,val5 
     1721               enddo 
     1722               if (val5.ge.1) write(*,*) 'NO POINT FOUND WITH NO ICE' 
     1723
     1724               ! Copy point in the selected area
     1725               tsurf(ig)=tsurf(jref)
     1726               qsurf(ig,igcm_n2)=qsurf(jref,igcm_n2)
     1727               qsurf(ig,igcm_ch4_ice)=qsurf(jref,igcm_ch4_ice)
     1728               qsurf(ig,igcm_co_ice)=qsurf(jref,igcm_co_ice)
     1729               DO l=1,nsoilmx
     1730                  tsoil(ig,l)=tsoil(jref,l)
     1731               ENDDO
     1732             ENDIF
     1733             ! If below line and no ice: add ice
     1734             IF ( (latfi(ig)*180./pi.le.val11) .and.
     1735     &             (latfi(ig)*180./pi.le.val1+val2) .and.
     1736     &             (qsurf(ig,igcm_n2).eq.0.) ) then
     1737               ! Look for same longitude point where ice           
     1738               val5=1.
     1739               jref=ig
     1740               do while (val5.le.1.and.jref.lt.ngridmx-iip1)
     1741                  ! southward point
     1742                  jref=jref+iip1-1
     1743                  ! ice at the point
     1744                  val5=qsurf(jref,igcm_n2)
     1745                  write(*,*) jref,
     1746     &                   latfi(jref)*180./pi,lonfi(jref)*180/pi,val5 
     1747               enddo 
     1748               if (val5.le.1) write(*,*) 'NO POINT FOUND WITH ICE' 
     1749
     1750               ! Copy point in the selected area
     1751               tsurf(ig)=tsurf(jref)
     1752               qsurf(ig,igcm_n2)=qsurf(jref,igcm_n2)
     1753               qsurf(ig,igcm_ch4_ice)=qsurf(jref,igcm_ch4_ice)
     1754               qsurf(ig,igcm_co_ice)=qsurf(jref,igcm_co_ice)
     1755               DO l=1,nsoilmx
     1756                  tsoil(ig,l)=tsoil(jref,l)
     1757               ENDDO
     1758             ENDIF
     1759
     1760          ENDDO
     1761
     1762c       source_ch4 : adding source ch4
     1763c       ----------------------------------------------------------
     1764        else if (modif(1:len_trim(modif)) .eq. 'source_ch4') then
     1765
     1766          write(*,*) 'Adding ch4 ice latitudinally '
     1767          write(*,*) 'Choice : lat1 and lat2 ?'
     1768 433      read(*,*,iostat=ierr) val,val2
     1769          if(ierr.ne.0) goto 433
     1770          write(*,*) 'Choice : lon1 and lon2 ?'
     1771 434      read(*,*,iostat=ierr) val3,val4
     1772          if(ierr.ne.0) goto 434
     1773          write(*,*) 'Choice amount (kg/m2)'
     1774 435      read(*,*,iostat=ierr) val5
     1775          if(ierr.ne.0) goto 435
     1776
     1777          DO ig=1,ngridmx
     1778             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1779     &              (latfi(ig)*180./pi.le.val2)  .and.
     1780     &              (lonfi(ig)*180./pi.ge.val3)  .and.
     1781     &              (lonfi(ig)*180./pi.lt.val4)  ) then
     1782                    qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)+val5
     1783             ENDIF
     1784          ENDDO
     1785
     1786c       source_co : adding source co
     1787c       ----------------------------------------------------------
     1788        else if (modif(1:len_trim(modif)) .eq. 'source_co') then
     1789
     1790          write(*,*) 'Adding co ice latitudinally '
     1791          write(*,*) 'Choice : lat1 and lat2 ?'
     1792 436      read(*,*,iostat=ierr) val,val2
     1793          if(ierr.ne.0) goto 436
     1794          write(*,*) 'Choice : lon1 and lon2 ?'
     1795 437      read(*,*,iostat=ierr) val3,val4
     1796          if(ierr.ne.0) goto 437
     1797          write(*,*) 'Choice amount (kg/m2)'
     1798 438      read(*,*,iostat=ierr) val5
     1799          if(ierr.ne.0) goto 438
     1800
     1801          DO ig=1,ngridmx
     1802             IF (   (latfi(ig)*180./pi.ge.val)  .and.
     1803     &              (latfi(ig)*180./pi.le.val2)  .and.
     1804     &              (lonfi(ig)*180./pi.ge.val3)  .and.
     1805     &              (lonfi(ig)*180./pi.lt.val4)  ) then
     1806                    qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)+val5
     1807             ENDIF
     1808          ENDDO
     1809
     1810!       therm_ini_s: (re)-set soil thermal inertia to reference surface values
     1811!       ----------------------------------------------------------------------
     1812        else if (modif(1:len_trim(modif)).eq.'therm_ini_s') then
     1813!          write(*,*)"surfithfi(1):",surfithfi(1)
     1814          do isoil=1,nsoilmx
     1815             inertiedat(1:ngridmx,isoil)=surfithfi(1:ngridmx)
     1816          enddo
     1817          write(*,*)'OK: Soil thermal inertia has been reset to referenc
     1818     &e surface values'
     1819          write(*,*)"inertiedat(1,1):",inertiedat(1,1)
     1820          ithfi(:,:)=inertiedat(:,:)
     1821         ! recast ithfi() onto ith()
     1822         call gr_fi_dyn(nsoilmx,ngridmx,iip1,jjp1,ithfi,ith)
     1823
     1824!       inert3d: set soil thermal inertia to specific uniform value
     1825!       ----------------------------------------------------------------------
     1826        else if (modif(1:len_trim(modif)).eq.'inert3d') then
     1827          write(*,*) 'Actual value of surf Thermal inertia at ig=1: ',
     1828     &                    inertiedat(1,1), ' SI'
     1829          write(*,*) 'Value of Thermal inertia (SI) ? '
     1830          read(*,*) val
     1831          do isoil=1,nsoilmx
     1832            do ig=1,ngridmx
     1833              inertiedat(ig,isoil)=val
     1834            enddo
     1835          enddo
     1836          write(*,*)'OK: Soil TI set to ',val,' SI everywhere'
     1837          ithfi(:,:)=inertiedat(:,:)
     1838         ! recast ithfi() onto ith()
     1839          call gr_fi_dyn(nsoilmx,ngridmx,iip1,jjp1,ithfi,ith)
     1840
     1841!       subsoilice_n: Put deep ice layer in northern hemisphere soil
     1842!       ------------------------------------------------------------
     1843       else if (modif(1:len_trim(modif)).eq.'subsoilice_n') then
     1844
     1845         write(*,*)'From which latitude (in deg.), up to the north pole,
     1846     &should we put subterranean ice?'
     1847         ierr=1
     1848         do while (ierr.ne.0)
     1849          read(*,*,iostat=ierr) val
     1850          if (ierr.eq.0) then ! got a value
     1851            ! do a sanity check
     1852            if((val.lt.0.).or.(val.gt.90)) then
     1853               write(*,*)'Latitude should be between 0 and 90 deg. !!!'
    8491854               ierr=1
    850              endif
    851              if(val2.lt.layer(1)) then
    852               if(val2.eq.0) then
    853                write(*,*)'Thermal inertia set for all subsurface layers'
    854                ierr=0
    855               else
    856                write(*,*)'Depth should be more than ',layer(1)
    857                ierr=1
    858               endif
    859              endif
    860            endif
    861           enddo ! of do while
    862 
    863           ! find the reference index iref the depth corresponds to
    864           if(val2.eq.0) then
    865            iref=1
    866            write(*,*)'Level selected is first level: ',layer(iref),' m'
    867           else
    868            do isoil=1,nsoilmx-1
    869             if ((val2.gt.layer(isoil)).and.(val2.lt.layer(isoil+1)))
    870      &       then
    871              iref=isoil+1
    872              write(*,*)'Level selected : ',layer(isoil+1),' m'
    873              exit
    874             endif
    875            enddo
    876           endif
    877 
    878           DO ig=1,ngridmx
    879              DO j=iref,nsoilmx
    880                    ithfi(ig,j)=ith_bb
    881              ENDDO
    882           ENDDO
    883 
    884           CALL gr_fi_dyn(nsoilmx,ngridmx,iip1,jjp1,ithfi,ith)
    885 
    886 c       diurnal_TI : choice of thermal inertia values (global)
    887 c       ----------------------------------------------------------------
    888         else if (modif(1:len_trim(modif)) .eq. 'diurnal_TI') then
    889 
    890          write(*,*) 'New value for diurnal thermal inertia  ?'
    891  106     read(*,*,iostat=ierr) ith_bb
    892          if(ierr.ne.0) goto 106
    893          write(*,*) 'Diurnal thermal inertia (new value):',ith_bb
    894 
    895          write(*,*)'At which depth (in m.) does the ice layer ends?'
    896          write(*,*)'(currently, the soil layer 1 and nsoil are:'
    897      &              ,layer(1),' - ',layer(nsoilmx),')'
     1855            else ! find corresponding jref (nearest latitude)
     1856              ! note: rlatu(:) contains decreasing values of latitude
     1857              !       starting from PI/2 to -PI/2
     1858              do j=1,jjp1
     1859               if ((rlatu(j)*180./pi.ge.val).and.
     1860     &              (rlatu(j+1)*180./pi.le.val)) then
     1861                  ! find which grid point is nearest to val:
     1862                  if (abs(rlatu(j)*180./pi-val).le.
     1863     &                abs((rlatu(j+1)*180./pi-val))) then
     1864                    jref=j
     1865                  else
     1866                    jref=j+1
     1867                  endif
     1868                 
     1869                  write(*,*)'Will use nearest grid latitude which is:',
     1870     &                     rlatu(jref)*180./pi
     1871               endif
     1872              enddo ! of do j=1,jjp1
     1873            endif ! of if((val.lt.0.).or.(val.gt.90))
     1874          endif !of if (ierr.eq.0)
     1875         enddo ! of do while
     1876
     1877         ! Build layers() (as in soil_settings.F)
     1878         val2=sqrt(mlayer(0)*mlayer(1))
     1879         val3=mlayer(1)/mlayer(0)
     1880         do isoil=1,nsoilmx
     1881           layer(isoil)=val2*(val3**(isoil-1))
     1882         enddo
     1883
     1884         write(*,*)'At which depth (in m.) does the ice layer begin?'
     1885         write(*,*)'(currently, the deepest soil layer extends down to:'
     1886     &              ,layer(nsoilmx),')'
    8981887         ierr=1
    8991888         do while (ierr.ne.0)
    9001889          read(*,*,iostat=ierr) val2
    901           write(*,*)'val2 in diurnal_TI:',val2,'ierr=',ierr
     1890!         write(*,*)'val2:',val2,'ierr=',ierr
    9021891          if (ierr.eq.0) then ! got a value, but do a sanity check
    9031892            if(val2.gt.layer(nsoilmx)) then
     
    9111900          endif
    9121901         enddo ! of do while
    913 
    914            ! find the reference index iref the depth corresponds to
     1902 
     1903         ! find the reference index iref the depth corresponds to
     1904!        if (val2.lt.layer(1)) then
     1905!         iref=1
     1906!        else
    9151907         do isoil=1,nsoilmx-1
    916             !write(*,*)'isoil, ',isoil,val2
    917             !write(*,*)'lay(i),lay(i+1):',layer(isoil),layer(isoil+1),' m'
    918             if ((val2.gt.layer(isoil)).and.(val2.lt.layer(isoil+1)))
     1908           if((val2.gt.layer(isoil)).and.(val2.lt.layer(isoil+1)))
    9191909     &       then
    920              iref=isoil+1
    921              write(*,*)'Level selected : ',layer(isoil+1),' m'
     1910             iref=isoil
    9221911             exit
     1912           endif
     1913         enddo
     1914
     1915         ! thermal inertia of the ice:
     1916         ierr=1
     1917         do while (ierr.ne.0)
     1918          write(*,*)'What is the value of subterranean ice thermal inert
     1919     &ia? (e.g.: 2000)'
     1920          read(*,*,iostat=ierr)iceith
     1921         enddo ! of do while
     1922
     1923         ! recast ithfi() onto ith()
     1924         call gr_fi_dyn(nsoilmx,ngridmx,iip1,jjp1,ithfi,ith)
     1925     
     1926         do j=1,jref
     1927!           write(*,*)'j:',j,'rlatu(j)*180./pi:',rlatu(j)*180./pi
     1928            do i=1,iip1 ! loop on longitudes
     1929            ! Build "equivalent" thermal inertia for the mixed layer
     1930             ith(i,j,iref+1)=sqrt((layer(iref+1)-layer(iref))/
     1931     &                     (((val2-layer(iref))/(ith(i,j,iref)**2))+
     1932     &                      ((layer(iref+1)-val2)/(iceith)**2)))
     1933             ! Set thermal inertia of lower layers
     1934             do isoil=iref+2,nsoilmx
     1935              ith(i,j,isoil)=iceith ! ice
     1936             enddo
     1937            enddo ! of do i=1,iip1
     1938         enddo ! of do j=1,jjp1
     1939 
     1940
     1941         CALL gr_dyn_fi(nsoilmx,iip1,jjp1,ngridmx,ith,ithfi)
     1942
     1943!       subsoilice_s: Put deep ice layer in southern hemisphere soil
     1944!       ------------------------------------------------------------
     1945        else if (modif(1:len_trim(modif)).eq.'subsoilice_s') then
     1946
     1947         write(*,*)'From which latitude (in deg.), down to the south pol
     1948     &e, should we put subterranean ice?'
     1949         ierr=1
     1950         do while (ierr.ne.0)
     1951          read(*,*,iostat=ierr) val
     1952          if (ierr.eq.0) then ! got a value
     1953            ! do a sanity check
     1954            if((val.gt.0.).or.(val.lt.-90)) then
     1955              write(*,*)'Latitude should be between 0 and -90 deg. !!!'
     1956              ierr=1
     1957            else ! find corresponding jref (nearest latitude)
     1958              ! note: rlatu(:) contains decreasing values of latitude
     1959              !       starting from PI/2 to -PI/2
     1960              do j=1,jjp1
     1961                if ((rlatu(j)*180./pi.ge.val).and.
     1962     &              (rlatu(j+1)*180./pi.le.val)) then
     1963                ! find which grid point is nearest to val:
     1964                  if (abs(rlatu(j)*180./pi-val).le.
     1965     &                abs((rlatu(j+1)*180./pi-val))) then
     1966                   jref=j
     1967                  else
     1968                   jref=j+1
     1969                  endif
     1970 
     1971                 write(*,*)'Will use nearest grid latitude which is:',
     1972     &                     rlatu(jref)*180./pi
     1973                endif
     1974              enddo ! of do j=1,jjp1
     1975            endif ! of if((val.lt.0.).or.(val.gt.90))
     1976          endif !of if (ierr.eq.0)
     1977         enddo ! of do while
     1978
     1979         ! Build layers() (as in soil_settings.F)
     1980         val2=sqrt(mlayer(0)*mlayer(1))
     1981         val3=mlayer(1)/mlayer(0)
     1982         do isoil=1,nsoilmx
     1983           layer(isoil)=val2*(val3**(isoil-1))
     1984         enddo
     1985
     1986         write(*,*)'At which depth (in m.) does the ice layer begin?'
     1987         write(*,*)'(currently, the deepest soil layer extends down to:'
     1988     &              ,layer(nsoilmx),')'
     1989         ierr=1
     1990         do while (ierr.ne.0)
     1991          read(*,*,iostat=ierr) val2
     1992!         write(*,*)'val2:',val2,'ierr=',ierr
     1993          if (ierr.eq.0) then ! got a value, but do a sanity check
     1994            if(val2.gt.layer(nsoilmx)) then
     1995              write(*,*)'Depth should be less than ',layer(nsoilmx)
     1996              ierr=1
    9231997            endif
     1998            if(val2.lt.layer(1)) then
     1999              write(*,*)'Depth should be more than ',layer(1)
     2000              ierr=1
     2001            endif
     2002          endif
     2003         enddo ! of do while
     2004 
     2005         ! find the reference index iref the depth corresponds to
     2006          do isoil=1,nsoilmx-1
     2007           if((val2.gt.layer(isoil)).and.(val2.lt.layer(isoil+1)))
     2008     &       then
     2009             iref=isoil
     2010             exit
     2011           endif
     2012          enddo
     2013 
     2014         ! thermal inertia of the ice:
     2015         ierr=1
     2016         do while (ierr.ne.0)
     2017          write(*,*)'What is the value of subterranean ice thermal inert
     2018     &ia? (e.g.: 2000)'
     2019          read(*,*,iostat=ierr)iceith
     2020         enddo ! of do while
     2021 
     2022         ! recast ithfi() onto ith()
     2023         call gr_fi_dyn(nsoilmx,ngridmx,iip1,jjp1,ithfi,ith)
     2024 
     2025         do j=jref,jjp1
     2026!           write(*,*)'j:',j,'rlatu(j)*180./pi:',rlatu(j)*180./pi
     2027            do i=1,iip1 ! loop on longitudes
     2028            ! Build "equivalent" thermal inertia for the mixed layer
     2029             ith(i,j,iref+1)=sqrt((layer(iref+1)-layer(iref))/
     2030     &                     (((val2-layer(iref))/(ith(i,j,iref)**2))+
     2031     &                      ((layer(iref+1)-val2)/(iceith)**2)))
     2032             ! Set thermal inertia of lower layers
     2033             do isoil=iref+2,nsoilmx
     2034              ith(i,j,isoil)=iceith ! ice
     2035             enddo
     2036            enddo ! of do i=1,iip1
     2037         enddo ! of do j=jref,jjp1
     2038
     2039         CALL gr_dyn_fi(nsoilmx,iip1,jjp1,ngridmx,ith,ithfi)
     2040
     2041c       ----------------------------------------------------------
     2042c       'reservoir_SP' : increase or decrase ices reservoir in SP by factor
     2043c       ----------------------------------------------------------
     2044        else if (modif(1:len_trim(modif)).eq.'reservoir_SP') then
     2045          write(*,*) "Increase/Decrease N2 reservoir by factor :"
     2046          read(*,*) val7
     2047          write(*,*) "Increase/Decrease CH4 reservoir by factor :"
     2048          read(*,*) val8
     2049          write(*,*) "Increase/Decrease CO reservoir by factor :"
     2050          read(*,*) val9
     2051
     2052          ! Definition SP:
     2053         val3=-33.   !lat1
     2054         val4=50.    !lat2
     2055         val5=140.   ! lon1
     2056         val6=-155.  ! lon2
     2057         choice=-50. ! min phisfi
     2058         write(*,*) 'def SP :'
     2059         write(*,*) 'lat :',val3,val4
     2060         write(*,*) 'lon :',val5,'180 / -180',val6
     2061         write(*,*) 'choice phisfi min :',choice
     2062
     2063         DO ig=1,ngridmx
     2064
     2065           IF (   (latfi(ig)*180./pi.ge.val3)  .and.
     2066     &            (latfi(ig)*180./pi.le.val4)  .and.
     2067     &      (  ((lonfi(ig)*180./pi.ge.-180.)  .and.
     2068     &                       (lonfi(ig)*180./pi.le.val6))  .or.
     2069     &         ((lonfi(ig)*180./pi.ge.val5)  .and.
     2070     &                       (lonfi(ig)*180./pi.le.180.))) ) then
     2071
     2072                IF ((phisfi(ig).le.choice)) then  !.and.
     2073c    &                              (qsurf(ig,igcm_n2).ge.50)) then
     2074
     2075                  qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)*val7
     2076                  qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)*val8
     2077                  qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)*val9
     2078                ENDIF
     2079           ENDIF
     2080          ENDDO
     2081
     2082c       ----------------------------------------------------------
     2083c       'reservoir' : increase or decrase ices reservoir by factor
     2084c       ----------------------------------------------------------
     2085        else if (modif(1:len_trim(modif)).eq.'reservoir') then
     2086          write(*,*) "Increase/Decrease N2 reservoir by factor :"
     2087          read(*,*) val
     2088          write(*,*) "Increase/Decrease CH4 reservoir by factor :"
     2089          read(*,*) val2
     2090          write(*,*) "Increase/Decrease CO reservoir by factor :"
     2091          read(*,*) val3
     2092
     2093          DO ig=1,ngridmx
     2094           qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)*val
     2095           qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)*val2
     2096           qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)*val3
     2097          ENDDO
     2098
     2099c       --------------------------------------------------------
     2100c       'plutomap' : initialize pluto ices distribution
     2101c       --------------------------------------------------------
     2102        else if (modif(1:len_trim(modif)).eq.'plutomap') then
     2103
     2104         write(*,*) 'pluto_map.dat has to be in your simulation file !!'
     2105         open(27,file='pluto_map.dat')
     2106         N2_pluto_dat(:,:) =0.
     2107         CH4_pluto_dat(:,:) =0.
     2108         CO_pluto_dat(:,:) =0.
     2109
     2110         ! Dimension file pluto_map
     2111         IF (jm_plu.ne.180) then
     2112             write(*,*) 'Newstart : you should set jm_plu to 180'
     2113             stop
     2114         ENDIF
     2115         ! Read values
     2116         do j=1,jm_plu+1
     2117           read(27,*) (map_pluto_dat(i,j),i=1,im_plu)
     2118           do i=1,im_plu
     2119
     2120               !!!!!! BTD_v2
     2121               if (map_pluto_dat(i,j).eq.3) then
     2122                  N2_pluto_dat(i,j)=100000.
     2123               elseif (map_pluto_dat(i,j).eq.4) then
     2124                  CH4_pluto_dat(i,j)=100000.
     2125               elseif (map_pluto_dat(i,j).eq.0) then
     2126                  alb_dat(i,j)=0.3
     2127               elseif (map_pluto_dat(i,j).eq.6) then
     2128                  alb_dat(i,j)=0.6
     2129               elseif (map_pluto_dat(i,j).eq.7) then
     2130                  alb_dat(i,j)=0.1
     2131               endif
     2132
     2133               !!!!!! BTD
     2134               !if (map_pluto_dat(i,j).eq.3) then
     2135               !   CH4_pluto_dat(i,j)=100000.
     2136               !endif
     2137           end do
     2138         end do
     2139         close (27)
     2140         ! Interpolate
     2141
     2142         !! latitude and longitude in REindexed pluto map  :
     2143         latv_plu(1)=90. *pi/180.
     2144         do j=2,jm_plu
     2145          latv_plu(j)= (90-(j-1 -0.5)*180./(jm_plu-1))*pi/180.
     2146         end do
     2147         latv_plu(jm_plu+1)= -90. *pi/180.
     2148
     2149         do i=1,im_plu+1
     2150          lonu_plu(i)=(-180+ (i-1)*360./(im_plu) ) *pi/180.
    9242151         enddo
    9252152
     2153         !Reindexation to shift the longitude grid like a LMD GCM grid...
     2154         do j=1,jm_plu+1
     2155            N2_pluto_rein(1,j)=(N2_pluto_dat(1,j)+
     2156     &                           N2_pluto_dat(im_plu,j))/2
     2157            CH4_pluto_rein(1,j)=(CH4_pluto_dat(1,j)+
     2158     &                          CH4_pluto_dat(im_plu,j))/2
     2159            CO_pluto_rein(1,j)=(CO_pluto_dat(1,j)+
     2160     &                           CO_pluto_dat(im_plu,j))/2
     2161            alb_rein(1,j)=(alb_dat(1,j)+
     2162     &                           alb_dat(im_plu,j))/2
     2163            do i=2,im_plu
     2164               N2_pluto_rein(i,j)=(N2_pluto_dat(i-1,j)+
     2165     &                           N2_pluto_dat(i,j))/2
     2166               CH4_pluto_rein(i,j)=(CH4_pluto_dat(i-1,j)+
     2167     &                           CH4_pluto_dat(i,j))/2
     2168               CO_pluto_rein(i,j)=(CO_pluto_dat(i-1,j)+
     2169     &                           CO_pluto_dat(i,j))/2
     2170               alb_rein(i,j)=(alb_dat(i-1,j)+
     2171     &                           alb_dat(i,j))/2
     2172            end do
     2173            N2_pluto_rein(im_plu+1,j) = N2_pluto_rein(1,j)
     2174            CH4_pluto_rein(im_plu+1,j) = CH4_pluto_rein(1,j)
     2175            CO_pluto_rein(im_plu+1,j) = CO_pluto_rein(1,j)
     2176            alb_rein(im_plu+1,j) = alb_rein(1,j)
     2177         end do
     2178
     2179         call interp_horiz(N2_pluto_rein,N2_pluto_gcm,
     2180     & im_plu,jm_plu,iim,jjm,1,lonu_plu,latv_plu,rlonu,rlatv)
     2181         call interp_horiz(CH4_pluto_rein,CH4_pluto_gcm,
     2182     & im_plu,jm_plu,iim,jjm,1,lonu_plu,latv_plu,rlonu,rlatv)
     2183         call interp_horiz(CO_pluto_rein,CO_pluto_gcm,
     2184     & im_plu,jm_plu,iim,jjm,1,lonu_plu,latv_plu,rlonu,rlatv)
     2185         call interp_horiz(alb_rein,alb_gcm,
     2186     & im_plu,jm_plu,iim,jjm,1,lonu_plu,latv_plu,rlonu,rlatv)
     2187
     2188         ! Switch dyn grid to fi grid
     2189         qsurf_tmp(:,:) =0.
     2190         CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,
     2191     &         N2_pluto_gcm,qsurf_tmp(1,igcm_n2))
     2192         if (igcm_ch4_ice.ne.0) then
     2193          CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,
     2194     &         CH4_pluto_gcm,qsurf_tmp(1,igcm_ch4_ice))
     2195         endif
     2196         if (igcm_co_ice.ne.0) then
     2197          CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,
     2198     &         CO_pluto_gcm,qsurf_tmp(1,igcm_co_ice))
     2199         endif
     2200         alb=alb_gcm
     2201         CALL gr_dyn_fi(1,iip1,jjp1,ngridmx,alb_gcm,albfi)
     2202         !print*, 'N2dat=',N2_pluto_gcm
     2203         !print*, 'COdat=',CO_pluto_gcm
     2204         !print*, 'CH4dat=',CH4_pluto_gcm
     2205         print*, 'N2dat=',qsurf_tmp(:,igcm_n2)
     2206         print*, 'COdat=',qsurf_tmp(:,igcm_co_ice)
     2207         print*, 'CH4dat=',qsurf_tmp(:,igcm_ch4_ice)
     2208
     2209         ! Fill
    9262210         DO ig=1,ngridmx
    927              DO j=1,iref
    928                    ithfi(ig,j)=ith_bb
    929              ENDDO
    930          ENDDO
    931 
    932          CALL gr_fi_dyn(nsoilmx,ngridmx,iip1,jjp1,ithfi,ith)
    933 
    934 
    935 
    936 
    937 
    938 
    939 
    940 
    941 
    942 
    943 
    944 
    945 
    946 
    947 
    948 
    949 
    950 
    951 
    952 
    953 
    954 
    955 
     2211           qsurf(ig,igcm_n2)=qsurf(ig,igcm_n2)+qsurf_tmp(ig,igcm_n2)
     2212           if (igcm_ch4_ice.ne.0) then
     2213            qsurf(ig,igcm_ch4_ice)=qsurf(ig,igcm_ch4_ice)+
     2214     &                               qsurf_tmp(ig,igcm_ch4_ice)
     2215           endif
     2216           if (igcm_co_ice.ne.0) then
     2217            qsurf(ig,igcm_co_ice)=qsurf(ig,igcm_co_ice)+
     2218     &                               qsurf_tmp(ig,igcm_co_ice)
     2219           endif
     2220         ENDDO       
    9562221
    9572222        endif
     
    9612226 999  continue
    9622227
    963  
    964 c=======================================================================
    965 c   Initialisation for cloud fraction and oceanic ice (added by BC 2010)
    966 c=======================================================================
    967 !      DO ig=1, ngridmx
    968 !         totalfrac(ig)=0.5
    969 !         DO l=1,llm
    970 !            cloudfrac(ig,l)=0.5
    971 !         ENDDO
    972 ! Ehouarn, march 2012: also add some initialisation for hice
    973 !         hice(ig)=0.0
    974 !      ENDDO
    975      
    976 c========================================================
    977 
    978 !      DO ig=1,ngridmx
    979 !         IF(tsurf(ig) .LT. 273.16-1.8) THEN
    980 !            hice(ig)=(273.16-1.8-tsurf(ig))/(273.16-1.8-240)*1.
    981 !            hice(ig)=min(hice(ig),1.0)
    982 !         ENDIF
    983 !      ENDDO
    984 
    985 
    986 
    987 
    9882228c=======================================================================
    9892229c   Correct pressure on the new grid (menu 0)
    9902230c=======================================================================
    991 
    9922231
    9932232      if ((choix_1.eq.0).and.(.not.flagps0)) then
     
    10082247      end if
    10092248
    1010          
    1011 c=======================================================================
    1012 c=======================================================================
    1013 
    10142249c=======================================================================
    10152250c    Initialisation de la physique / ecriture de newstartfi :
    10162251c=======================================================================
    1017 
    10182252
    10192253      CALL inifilr
     
    11112345      end
    11122346
     2347!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     2348      function dist_pluto(lat1,lon1,lat2,lon2)
     2349      implicit none
     2350      real dist_pluto
     2351      real lat1,lon1,lat2,lon2
     2352      real dlon, dlat
     2353      real a,c
     2354      real rad
     2355      rad=1190. ! km
     2356
     2357      dlon = lon2 - lon1
     2358      dlat = lat2 - lat1
     2359      a = (sin(dlat/2))**2 + cos(lat1) * cos(lat2) * (sin(dlon/2))**2
     2360      c = 2 * atan2( sqrt(a), sqrt(1-a) )
     2361      dist_pluto = rad * c
     2362      return
     2363      end
     2364
Note: See TracChangeset for help on using the changeset viewer.