Changeset 968 for codes


Ignore:
Timestamp:
09/02/19 12:22:39 (5 years ago)
Author:
jisesh
Message:

devel : nudge also surface pressure

Location:
codes/icosagcm/devel/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/dissip/guided_mod.f90

    r874 r968  
    88 
    99 
    10   SUBROUTINE init_guided(f_u,f_theta_rhodz) 
     10  SUBROUTINE init_guided(f_u,f_theta_rhodz,f_ps) 
    1111    USE icosa 
    1212    USE guided_ncar_mod, ONLY : init_guided_ncar => init_guided 
     
    1515    TYPE(t_field),POINTER :: f_u(:) 
    1616    TYPE(t_field),POINTER :: f_theta_rhodz(:) 
     17    TYPE(t_field),POINTER :: f_ps(:) 
    1718     
    1819    guided_type='none' 
     
    2627         
    2728      CASE ('nudging') 
    28         CALL init_guided_nudging(f_u,f_theta_rhodz) 
    29          
     29        CALL init_guided_nudging(f_u,f_theta_rhodz,f_ps) 
    3030      CASE DEFAULT 
    3131         PRINT*,"Bad selector for varaible guided_type >",TRIM(guided_type),"> option are <none>, <dcmip1>, <nudging>" 
  • codes/icosagcm/devel/src/dissip/nudging_mod.f90

    r948 r968  
    1212  PRIVATE 
    1313  ! nudging will be active outside a disc of radius 'radius' centered at 'center_lon', 'center lat'. 
    14   REAL(rstd) :: center_lon, center_lat, nudging_radius, time 
    15   !$OMP THREADPRIVATE(center_lon, center_lat, nudging_radius, time) 
    16  
     14  REAL(rstd) :: center_lon, center_lat, nudging_radius, nudging_relaxation_time 
     15  !$OMP THREADPRIVATE(center_lon, center_lat, nudging_radius, nudging_relaxation_time) 
    1716  TYPE(t_field),POINTER :: f_relax_coef_e(:), f_target_ue(:), & 
    18        f_relax_coef_i(:), f_target_theta_rhodz(:) 
     17       f_relax_coef_i(:), f_target_theta_rhodz(:),f_target_ps(:) 
    1918  CHARACTER(LEN=255),SAVE :: guided_nudging_field 
    2019  INTEGER,SAVE :: nudging_time 
     
    2423CONTAINS 
    2524 
    26   SUBROUTINE init_guided(f_u,f_theta_rhodz) 
     25  SUBROUTINE init_guided(f_u,f_theta_rhodz,f_ps) 
    2726    USE getin_mod, ONLY : getin 
    2827    USE math_const, ONLY : pi 
     
    3029    TYPE(t_field),POINTER :: f_u(:)! initial condition 
    3130    TYPE(t_field),POINTER :: f_theta_rhodz(:)! initial condition 
     31    TYPE(t_field),POINTER :: f_ps(:)! initial condition 
    3232    REAL(rstd), POINTER :: ue(:,:), target_ue(:,:), coef_e(:)  
    3333    REAL(rstd), POINTER :: theta_rhodz(:,:,:), target_theta_rhodz(:,:,:), coef_i(:)  
     34    REAL(rstd), POINTER :: ps2(:), target_ps(:) 
    3435    INTEGER :: ind 
    3536    ! read DEF keys describing how to relax 
     
    4142    CALL getin('nudging_radius', nudging_radius) 
    4243    nudging_radius = nudging_radius / scale_factor 
    43  
    44     nudging_time=0. 
     44    ! we should check that radius>0 
     45 
     46    nudging_time=0 
    4547    CALL getin('nudging_time', nudging_time) 
    4648    nudging_time = nudging_time/scale_factor 
    47     ! we should check that radius>0 
     49    !nudging_time=0 
     50 
     51    nudging_relaxation_time = 0. 
     52    CALL getin('nudging_relaxation_time', nudging_relaxation_time) 
     53    nudging_relaxation_time = nudging_relaxation_time/scale_factor 
     54 
    4855    CALL getin("guided_nudging_field",guided_nudging_field) 
    4956 
    5057    SELECT CASE(TRIM(guided_nudging_field)) 
    51         CASE ('wind') 
    52             CALL allocate_field(f_relax_coef_e, field_u, type_real, name='nudging_coef_e') 
    53             CALL allocate_field(f_target_ue, field_u, type_real, llm, name='nudging_target_e') 
    54         CASE ('temperature') 
    55             CALL allocate_field(f_relax_coef_i, field_t, type_real, name='nudging_coef_i') 
    56             CALL allocate_field(f_target_theta_rhodz, field_t, type_real, llm,nqdyn, name='nudging_target_theta') 
    57         CASE ('wind_temperature') 
     58        CASE('wind','temperature','wind_temperature') 
    5859            CALL allocate_field(f_relax_coef_e, field_u, type_real, name='nudging_coef_e') 
    5960            CALL allocate_field(f_target_ue, field_u, type_real, llm, name='nudging_target_e') 
    6061            CALL allocate_field(f_relax_coef_i, field_t, type_real, name='nudging_coef_i') 
    6162            CALL allocate_field(f_target_theta_rhodz, field_t, type_real, llm,nqdyn, name='nudging_target_theta') 
     63            CALL allocate_field(f_target_ps, field_t, type_real, name='nudging_target_ps') 
    6264        CASE DEFAULT 
    6365                 PRINT*,"Bad selector for varaible init_guided_nudging>",TRIM(guided_nudging_field) 
     
    6567                 STOP 
    6668    END SELECT 
    67  
    6869    ! compute relax_coef and target_ue 
    6970    center_lon = center_lon * pi/180. 
     
    7980            target_theta_rhodz = f_target_theta_rhodz(ind) 
    8081            theta_rhodz = f_theta_rhodz(ind) 
     82            target_ps = f_target_ps(ind) 
     83            ps2 = f_ps(ind) 
    8184            CALL compute_relax_coef(coef_e, coef_i) 
    8285            CALL compute_target_u(ue, target_ue) 
    8386            CALL compute_target_center(theta_rhodz, target_theta_rhodz) 
     87            CALL compute_target_center2(ps2, target_ps) 
    8488    END DO 
    8589  END SUBROUTINE init_guided 
     
    101105  FUNCTION relax_coef(lon,lat) 
    102106    USE spherical_geom_mod, ONLY : dist_lonlat 
     107    USE time_mod!, ONLY : dt ! time step for a full RK step 
    103108    REAL(rstd), INTENT(IN) :: lon,lat 
    104109    REAL(rstd) :: relax_coef, dist, c 
    105110    ! NB : dist is computed on unit sphere 
    106     CALL dist_lonlat(lon, lat, center_lon, center_lat, dist)  
    107     c = tanh((1.-radius*dist/nudging_radius)*20.) ! 1 inside circle, -1 outside 
    108     IF (c>0.99) c=1 
    109     IF (c<-0.99) c=-1 
    110     relax_coef = .5*(1.+c) ! rescale to [0,1] range ; ! 1 inside circle, 0 outside 
     111    IF(nudging_radius>0.) THEN 
     112       CALL dist_lonlat(lon, lat, center_lon, center_lat, dist)  
     113       c = tanh((1.-radius*dist/nudging_radius)*20.) ! 1 inside circle, -1 outside 
     114       IF (c>0.99) c=1 
     115       IF (c<-0.99) c=-1 
     116       relax_coef = .5*(1.+c) ! rescale to [0,1] range ; ! 1 inside circle, 0 outside 
     117    ELSE 
     118       c = 0. 
     119    END IF 
     120 
     121    relax_coef = 1. - (1.-relax_coef) * dt / (dt + nudging_relaxation_time) 
    111122  END FUNCTION relax_coef 
    112123 
     
    139150  END SUBROUTINE compute_target_center 
    140151 
     152  SUBROUTINE compute_target_center2(theta_rhodz, target_theta_rhodz) 
     153    REAL(rstd), INTENT(OUT)  :: target_theta_rhodz(iim*jjm,nqdyn) 
     154    REAL(rstd), INTENT(IN) :: theta_rhodz(iim*jjm,nqdyn) 
     155    INTEGER :: ij, iq 
     156    DO iq=1, nqdyn 
     157          DO ij=ij_begin_ext, ij_end_ext 
     158             target_theta_rhodz(ij,iq)=theta_rhodz(ij,iq) 
     159          END DO 
     160    END DO 
     161  END SUBROUTINE compute_target_center2 
     162 
    141163!----------------------------- Relax towards target ------------------------------ 
    142164   
     
    146168    USE wind_mod 
    147169    USE transfert_mod 
    148     USE time_mod 
     170    USE time_mod, ONLY : dt ! time step for a full RK step 
    149171    USE vertical_remap_mod 
    150172    USE compute_pression_mod, ONLY : pression_mid 
     
    157179    TYPE(t_field),POINTER :: f_q(:) 
    158180    TYPE(t_field),POINTER, SAVE :: f_T_guided(:),  f_ulon_guided(:), f_ulat_guided(:),f_T_guided_interp(:), & 
    159                                    f_ulon_guided_interp(:),f_ulat_guided_interp(:) 
     181                                   f_ulon_guided_interp(:),f_ulat_guided_interp(:),f_ps_guided(:) 
    160182    REAL(rstd), POINTER :: target_ue(:,:), ue(:,:), coef_e(:) 
    161183    REAL(rstd), POINTER :: target_theta_rhodz(:,:,:), theta_rhodz(:,:,:), coef_i(:)  
     184    REAL(rstd), POINTER :: target_ps(:), ps2(:) 
    162185    INTEGER :: ind 
    163186     
    164     IF (abs(MOD(tt,REAL(nudging_time))-dt) < 1.0D-2) THEN  
    165         
     187    IF (abs(MOD(tt,REAL(nudging_time))-dt) < 1.0D-2) THEN 
     188 
     189      CALL allocate_field(f_ps_guided, field_t, type_real, name='nudging_ps') 
     190      CALL xios_read_field("ps_guided_read",f_ps_guided) 
     191      !f_ps = f_ps_guided  !================================================>FIX 
     192      CALL transfert_request(f_ps_guided,req_i0) 
     193      CALL transfert_request(f_ps_guided,req_i1) 
    166194      CALL allocate_field(f_T_guided, field_t, type_real, llm, name='nudging_T') 
    167195      CALL allocate_field(f_T_guided_interp, field_t, type_real, llm, name='nudging_T') 
     
    172200      CALL allocate_field(f_pmid_target,field_t,type_real,llm,name='target_pressure')  
    173201      CALL xios_read_field("T_guided_read",f_T_guided) 
    174       CALL pression_mid(f_ps, f_pmid_target) 
     202      CALL pression_mid(f_ps, f_pmid_target) ! call ps nudging before this 
    175203      CALL vertical_remap_extdata(f_T_guided,f_pmid_target,f_T_guided_interp) 
    176204      CALL transfert_request(f_T_guided,req_i0) 
     
    191219      CALL transfert_request(f_ulat_guided,req_i1) 
    192220      CALL transfert_request(f_ulat_guided_interp,req_i1) 
    193       CALL xios_write_field("ulat_guided_out",f_ulat_guided) 
     221      !CALL xios_write_field("ulat_guided_out",f_ulat_guided) 
     222      CALL xios_write_field("ulat_guided_out",f_T_guided_interp) 
    194223      CALL xios_write_field("ulon_guided_out",f_ulon_guided) 
    195224      CALL xios_write_field("T_guided_out",f_T_guided) 
     225      CALL xios_write_field("PS_guided_out",f_ps_guided) 
    196226      CALL ulonlat2un(f_ulon_guided_interp, f_ulat_guided,f_target_ue)  
    197227      CALL deallocate_field(f_T_guided) 
     
    202232      CALL deallocate_field(f_ulat_guided_interp) 
    203233      CALL deallocate_field(f_pmid_target) 
    204      
     234      !CALL deallocate_field(f_ps_guided) 
     235      print*,"-----------------------nudging end------------------" 
     236 
    205237    ENDIF 
    206238 
     
    217249       target_theta_rhodz = f_target_theta_rhodz(ind) 
    218250       theta_rhodz = f_theta_rhodz(ind) 
    219        CALL compute_guided_center(coef_i, target_theta_rhodz, theta_rhodz) 
     251       !CALL compute_guided_center(coef_i, target_theta_rhodz, theta_rhodz) 
     252       target_ps = f_ps_guided(ind) 
     253       ps2 = f_ps(ind) 
     254       CALL compute_guided_center2(coef_i, target_ps, ps2) 
    220255    END DO 
    221256 
     
    253288    END DO 
    254289  END SUBROUTINE compute_guided_center 
     290 
     291  SUBROUTINE compute_guided_center2(coef_i, target_theta_rhodz, theta_rhodz) 
     292    REAL(rstd), INTENT(IN) :: coef_i(iim*jjm) 
     293    REAL(rstd), INTENT(IN) :: target_theta_rhodz(iim*jjm,nqdyn) 
     294    REAL(rstd), INTENT(INOUT) :: theta_rhodz(iim*jjm,nqdyn) 
     295    INTEGER :: ij, iq 
     296    DO iq=1, nqdyn 
     297          DO ij=ij_begin_ext, ij_end_ext 
     298             theta_rhodz(ij,iq) = theta_rhodz(ij,iq)*coef_i(ij) + & 
     299                  target_theta_rhodz(ij,iq)*(1.-coef_i(ij)) 
     300          END DO 
     301    END DO 
     302  END SUBROUTINE compute_guided_center2 
    255303   
    256304END MODULE nudging_mod 
  • codes/icosagcm/devel/src/time/timeloop_gcm.f90

    r950 r968  
    167167 
    168168    CALL etat0(f_ps,f_mass,f_phis,f_theta_rhodz,f_u, f_geopot,f_W, f_q) 
    169      
    170     CALL init_guided(f_u,f_theta_rhodz) 
     169    
     170    CALL init_guided(f_u,f_theta_rhodz,f_ps) 
    171171 
    172172    CALL transfert_request(f_phis,req_i0)  
Note: See TracChangeset for help on using the changeset viewer.