wrf svn trunk commit r4103
[wrffire.git] / wrfv2_fire / var / da / da_minimisation / da_minimisation.f90
blob3f6799cc091fdaf78b40338558ad32bce9f2429f
1 module da_minimisation
3 !---------------------------------------------------------------------------
4 ! Purpose: Collection of routines associated with minimisation.
5 !---------------------------------------------------------------------------
7 use module_configure, only : grid_config_rec_type
8 use module_dm, only : wrf_dm_sum_real
9 use module_domain, only : domain, ep_type, vp_type
10 use module_state_description, only : dyn_em,dyn_em_tl,dyn_em_ad,p_g_qv
12 !#ifdef DM_PARALLEL
13 ! use mpi, only : mpi_barrier
14 !#endif
16 use da_airep, only : da_calculate_grady_airep, da_ao_stats_airep, &
17 da_oi_stats_airep, da_get_innov_vector_airep, da_residual_airep, &
18 da_jo_and_grady_airep
19 use da_airsr , only : da_calculate_grady_airsr, da_ao_stats_airsr, &
20 da_oi_stats_airsr, da_get_innov_vector_airsr, da_residual_airsr, &
21 da_jo_and_grady_airsr
22 use da_bogus, only : da_calculate_grady_bogus, da_ao_stats_bogus, &
23 da_oi_stats_bogus, da_get_innov_vector_bogus, da_residual_bogus, &
24 da_jo_and_grady_bogus
25 use da_buoy , only : da_calculate_grady_buoy, da_ao_stats_buoy, &
26 da_oi_stats_buoy,da_get_innov_vector_buoy, da_residual_buoy, &
27 da_jo_and_grady_buoy
28 use da_control, only : trace_use,var4d_coupling_disk_simul, &
29 var4d, rootproc,jcdfi_use,jcdfi_io,var4d_coupling,ierr,comm,num_fgat_time, &
30 stdout, eps, stats_unit, test_dm_exact, global, multi_inc, &
31 calculate_cg_cost_fn,anal_type_randomcv,cv_size_domain,je_factor, &
32 jb_factor,ntmax,omb_add_noise,write_iv_rad_ascii,use_obs_errfac, &
33 rtm_option,rtm_option_rttov, rtm_option_crtm, anal_type_verify, &
34 write_filtered_rad,omb_set_rand,use_rad,var_scaling2,var_scaling1, &
35 var_scaling4,var_scaling5,var_scaling3, jo_unit, &
36 print_detail_grad,omb_set_rand,grad_unit,cost_unit, &
37 cv_size_domain_je,cv_size_domain_jb, num_pseudo, cv_options, &
38 sound, mtgirs, sonde_sfc, synop, profiler, gpsref, gpspw, polaramv, geoamv, ships, metar, &
39 satem, radar, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep,tamdar, tamdar_sfc, &
40 bogus, buoy, qscat,pseudo, radiance, monitor_on, max_ext_its, use_crtm_kmatrix, &
41 precondition_cg, precondition_factor, cv_size_domain_jp, use_varbc, varbc_factor, &
42 num_procs, myproc, use_gpspwobs, use_gpsztdobs, pseudo_var, num_pseudo, &
43 num_ob_indexes, num_ob_vars, npres_print, pptop, ppbot, qcstat_conv_unit, &
44 orthonorm_gradient, its, ite, jts, jte, kte, ids, ide, jds, jde, &
45 use_satcv, sensitivity_option, print_detail_outerloop
46 use da_define_structures, only : iv_type, y_type, j_type, be_type, &
47 xbx_type, jo_type, da_allocate_y,da_zero_x,da_zero_y,da_deallocate_y, &
48 da_zero_vp_type
49 use da_obs, only : da_transform_xtoy_adj,da_transform_xtoy, &
50 da_add_noise_to_ob,da_random_omb_all, da_obs_sensitivity
51 use da_geoamv, only : da_calculate_grady_geoamv, da_ao_stats_geoamv, &
52 da_oi_stats_geoamv, da_get_innov_vector_geoamv,da_residual_geoamv, &
53 da_jo_and_grady_geoamv
54 use da_gpspw, only : da_calculate_grady_gpspw, da_ao_stats_gpspw, &
55 da_oi_stats_gpspw, da_get_innov_vector_gpspw, da_residual_gpspw, &
56 da_jo_and_grady_gpspw, da_get_innov_vector_gpsztd
57 use da_gpsref, only : da_calculate_grady_gpsref, da_ao_stats_gpsref, &
58 da_oi_stats_gpsref, da_get_innov_vector_gpsref, da_residual_gpsref, &
59 da_jo_and_grady_gpsref
60 use da_obs_io, only : da_final_write_y, da_write_y, da_final_write_obs, &
61 da_write_obs,da_write_obs_etkf,da_write_noise_to_ob, da_use_obs_errfac, &
62 da_write_iv_for_multi_inc, da_read_iv_for_multi_inc
63 use da_metar, only : da_calculate_grady_metar, da_ao_stats_metar, &
64 da_oi_stats_metar, da_get_innov_vector_metar, da_residual_metar, &
65 da_jo_and_grady_metar
66 use da_pilot, only : da_calculate_grady_pilot, da_ao_stats_pilot, &
67 da_oi_stats_pilot, da_get_innov_vector_pilot, da_residual_pilot, &
68 da_jo_and_grady_pilot
69 use da_par_util, only : da_system,da_cv_to_global
70 use da_par_util1, only : da_proc_sum_real,da_proc_sum_ints
71 use da_polaramv, only : da_calculate_grady_polaramv, da_ao_stats_polaramv, &
72 da_oi_stats_polaramv, da_get_innov_vector_polaramv, da_residual_polaramv, &
73 da_jo_and_grady_polaramv
74 use da_profiler, only : da_calculate_grady_profiler, da_ao_stats_profiler, &
75 da_oi_stats_profiler,da_get_innov_vector_profiler, da_residual_profiler, &
76 da_jo_and_grady_profiler
77 use da_pseudo, only : da_calculate_grady_pseudo, da_ao_stats_pseudo, &
78 da_oi_stats_pseudo, da_get_innov_vector_pseudo, da_residual_pseudo, &
79 da_jo_and_grady_pseudo
80 use da_qscat, only : da_calculate_grady_qscat, da_ao_stats_qscat, &
81 da_oi_stats_qscat, da_get_innov_vector_qscat, da_residual_qscat, &
82 da_jo_and_grady_qscat
83 use da_mtgirs, only : da_calculate_grady_mtgirs, &
84 da_ao_stats_mtgirs, da_oi_stats_mtgirs,da_oi_stats_mtgirs, &
85 da_get_innov_vector_mtgirs, &
86 da_jo_and_grady_mtgirs, da_residual_mtgirs
87 use da_tamdar, only : da_calculate_grady_tamdar, &
88 da_ao_stats_tamdar, da_oi_stats_tamdar,da_oi_stats_tamdar, &
89 da_get_innov_vector_tamdar, &
90 da_jo_and_grady_tamdar, da_residual_tamdar, &
91 da_calculate_grady_tamdar_sfc, &
92 da_ao_stats_tamdar_sfc, da_oi_stats_tamdar_sfc,da_oi_stats_tamdar_sfc, &
93 da_get_innov_vector_tamdar_sfc, &
94 da_jo_and_grady_tamdar_sfc, da_residual_tamdar_sfc
96 #if defined(RTTOV) || defined(CRTM)
97 use da_radiance, only : da_calculate_grady_rad, da_write_filtered_rad, &
98 da_get_innov_vector_radiance, satinfo
99 use da_radiance1, only : da_ao_stats_rad,da_oi_stats_rad, &
100 da_write_iv_rad_ascii,da_residual_rad,da_jo_and_grady_rad
101 #endif
102 use da_radar, only : da_calculate_grady_radar, da_ao_stats_radar, &
103 da_oi_stats_radar, da_get_innov_vector_radar, da_residual_radar, &
104 da_jo_and_grady_radar
105 use da_reporting, only : da_message, da_warning, da_error
106 use da_satem, only : da_calculate_grady_satem, da_ao_stats_satem, &
107 da_oi_stats_satem, da_get_innov_vector_satem, da_residual_satem, &
108 da_jo_and_grady_satem
109 use da_ships, only : da_calculate_grady_ships, da_ao_stats_ships, &
110 da_oi_stats_ships, da_get_innov_vector_ships, da_residual_ships, &
111 da_jo_and_grady_ships
112 use da_sound, only : da_calculate_grady_sound,da_calculate_grady_sonde_sfc, &
113 da_ao_stats_sound, da_oi_stats_sound,da_oi_stats_sound, &
114 da_oi_stats_sonde_sfc,da_ao_stats_sonde_sfc,da_get_innov_vector_sound, &
115 da_get_innov_vector_sonde_sfc,da_jo_and_grady_sound, da_residual_sound, &
116 da_jo_and_grady_sound,da_jo_and_grady_sonde_sfc,da_residual_sonde_sfc
117 use da_ssmi, only : da_calculate_grady_ssmi_tb,da_calculate_grady_ssmi_rv,da_calculate_grady_ssmt1, &
118 da_calculate_grady_ssmt2, da_ao_stats_ssmi_tb ,da_ao_stats_ssmt2, &
119 da_ao_stats_ssmt2, da_oi_stats_ssmt1, da_oi_stats_ssmt2, &
120 da_oi_stats_ssmi_tb,da_oi_stats_ssmi_rv,da_ao_stats_ssmt1,da_get_innov_vector_ssmi_tb, &
121 da_get_innov_vector_ssmi_rv, da_residual_ssmi_rv, da_residual_ssmi_tb, &
122 da_get_innov_vector_ssmt1,da_get_innov_vector_ssmt2, &
123 da_jo_and_grady_ssmt1, da_jo_and_grady_ssmt2,da_jo_and_grady_ssmi_tb, &
124 da_jo_and_grady_ssmi_rv, &
125 da_residual_ssmt1,da_residual_ssmt2, da_ao_stats_ssmi_rv
126 use da_synop, only : da_calculate_grady_synop, da_ao_stats_synop, &
127 da_oi_stats_synop, da_get_innov_vector_synop, da_residual_synop, &
128 da_jo_and_grady_synop
129 use da_statistics, only : da_analysis_stats, da_print_qcstat
130 use da_tools_serial, only : da_get_unit,da_free_unit
131 use da_tracing, only : da_trace_entry, da_trace_exit,da_trace
132 use da_transfer_model, only : da_transfer_wrftltoxa,da_transfer_xatowrftl, &
133 da_transfer_xatowrftl_adj,da_setup_firstguess,da_transfer_wrftltoxa_adj
134 #if defined(RTTOV) || defined(CRTM)
135 use da_varbc, only : da_varbc_tl,da_varbc_adj
136 #endif
137 use da_vtox_transforms, only : da_transform_vtox,da_transform_vtox_adj,da_transform_xtoxa,da_transform_xtoxa_adj
138 use da_wrf_interfaces, only : wrf_dm_bcast_real, wrf_get_dm_communicator
139 use da_wrfvar_io, only : da_med_initialdata_input
140 use module_symbols_util, only : wrfu_finalize
141 use da_lapack, only : dsteqr
143 implicit none
145 private :: da_dot, da_dot_cv
147 contains
149 #include "da_calculate_j.inc"
150 #include "da_calculate_gradj.inc"
151 #include "da_jo_and_grady.inc"
152 #include "da_calculate_residual.inc"
153 #include "da_get_var_diagnostics.inc"
154 #include "da_get_innov_vector.inc"
155 #include "da_dot.inc"
156 #include "da_dot_cv.inc"
157 #include "da_write_diagnostics.inc"
158 #include "da_minimise_cg.inc"
159 #include "da_minimise_lz.inc"
160 #include "da_calculate_grady.inc"
161 #include "da_transform_vtoy.inc"
162 #include "da_transform_vtoy_adj.inc"
163 #include "da_adjoint_sensitivity.inc"
164 #include "da_sensitivity.inc"
165 end module da_minimisation