47subroutine set_tracer_profile_(model, n, tracer, err_msg)
49integer,
intent(in) :: model
50integer,
intent(in) :: n
51real(FMS_TM_KIND_),
intent(inout),
dimension(:,:,:) :: tracer
52character(len=*),
intent(out),
optional :: err_msg
54real(FMS_TM_KIND_) :: surf_value, multiplier
55integer :: numlevels, k, n1, flag
56real(FMS_TM_KIND_) :: top_value, bottom_value
57character(len=80) :: scheme, control,profile_type
58character(len=128) :: err_msg_local
59character(len=11) :: chn
61integer,
parameter :: lkind=fms_tm_kind_
63if(.not.module_is_initialized)
call tracer_manager_init
65if (n < 1 .or. n > total_tracers(model))
then
67 err_msg_local =
' Invalid tracer index. Model name = '//trim(model_names(model))//
', Index='//trim(chn)
68 if(error_handler(
'set_tracer_profile', err_msg_local, err_msg))
return
70n1 = tracer_array(model,n)
74surf_value = 0.0e+00_lkind
76bottom_value = surf_value
81if ( query_method(
'profile_type',model,n,scheme,control))
then
84 if(lowercase(trim(scheme(1:5))).eq.
'fixed')
then
85 profile_type =
'Fixed'
86 flag =parse(control,
'surface_value',surf_value)
87 multiplier = 1.0_lkind
91 if(lowercase(trim(scheme(1:7))).eq.
'profile')
then
92 profile_type =
'Profile'
93 flag=parse(control,
'surface_value',surf_value)
94 if (surf_value .eq. 0.0_lkind) &
95 call mpp_error(fatal,
'set_tracer_profile : Cannot have a zero surface value for an exponential profile. Tracer '&
96 //tracers(n1)%tracer_name//
" "//control//
" "//scheme)
97 select case (tracers(n1)%model)
99 flag=parse(control,
'top_value',top_value)
100 if(mpp_pe()==mpp_root_pe() .and. flag == 0) &
101 call mpp_error(note,
'set_tracer_profile : Parameter top_value needs to be defined for the tracer profile.')
103 flag =parse(control,
'bottom_value',bottom_value)
104 if(mpp_pe() == mpp_root_pe() .and. flag == 0) &
105 call mpp_error(note, &
106 &
'set_tracer_profile : Parameter bottom_value needs to be defined for the tracer profile.')
118numlevels =
size(tracer,3) -1
119 select case (tracers(n1)%model)
121 multiplier = exp( log(top_value/surf_value) /real(numlevels,lkind))
122 tracer(:,:,1) = surf_value
123 do k = 2,
size(tracer,3)
124 tracer(:,:,k) = tracer(:,:,k-1) * multiplier
127 multiplier = exp( log(bottom_value/surf_value) / real(numlevels,lkind))
128 tracer(:,:,
size(tracer,3)) = surf_value
129 do k =
size(tracer,3) - 1, 1, -1
130 tracer(:,:,k) = tracer(:,:,k+1) * multiplier
136 if (mpp_pe() == mpp_root_pe() )
write(*,700)
'Tracer ',trim(tracers(n1)%tracer_name), &
137 ' initialized with surface value of ',surf_value, &
138 ' and vertical multiplier of ',multiplier
139 700
FORMAT (3a,e13.6,a,f13.6)
143end subroutine set_tracer_profile_