IGMBaseLib 1.0
|
00001 00018 module Field_IcGrid2D_error_norm_check 00019 00020 ! モジュール引用 ; Use statements 00021 ! 00022 00023 ! 種類型パラメータ 00024 ! Kind type parameter 00025 ! 00026 use dc_types, only: DP 00027 00028 00029 ! 正二十面体格子データの管理 00030 ! Manager of icosahedral grid data 00031 ! 00032 use IcGrid2D_FVM_Manager, only: & 00033 & IcGrid2D_FVM, & 00034 & get_EffSize_Min, get_EffSize_Max 00035 00036 ! 正二十面体格子上の物理場データの管理 00037 ! Manager of the physical field data on icosahedral grid 00038 ! 00039 use Field_IcGrid2D_Manager, only: & 00040 & Field_IcGrid2D, & 00041 & get_icgrid 00042 00043 ! 全矩形領域における厳密解に対する数値解の誤差チェック 00044 ! 00045 ! 00046 use rcregions_norm_check, only: & 00047 & calc_norm1, calc_norm2, calc_norm3 00048 00049 ! 宣言文 ; Declaration statements 00050 ! 00051 implicit none 00052 private 00053 00054 ! 公開手続き 00055 ! Public procedures 00056 ! 00057 public :: numerical_error_norm1, numerical_error_norm2, numerical_error_norminfinity 00058 00059 contains 00060 00061 ! 00076 function numerical_error_norm1( & 00077 & true_field, num_field & ! (in) 00078 & ) result(normVal) 00079 00080 ! 宣言文 ; Declaration statements 00081 ! 00082 type(Field_IcGrid2D), intent(in) :: true_field 00083 type(Field_IcGrid2D), intent(in) :: num_field 00084 real(DP) normVal 00085 00086 ! 作業変数 00087 ! Work variables 00088 ! 00089 integer :: EMin, EMax 00090 type(IcGrid2D_FVM), pointer :: icgrid 00091 00092 ! 実行文 ; Executable statements 00093 ! 00094 icgrid => get_icgrid(true_field) 00095 EMin = get_EffSize_Min(icgrid) 00096 EMax = get_EffSize_Max(icgrid) 00097 00098 normVal = calc_norm1( & 00099 & true_field%val(:,EMin:EMax, EMin:EMax, :), num_field%val(:,EMin:EMax, EMin:EMax, :) & 00100 & ) 00101 00102 end function numerical_error_norm1 00103 00104 ! 00119 function numerical_error_norm2( & 00120 & true_field, num_field & ! (in) 00121 & ) result(normVal) 00122 00123 ! 宣言文 ; Declaration statements 00124 ! 00125 type(Field_IcGrid2D), intent(in) :: true_field 00126 type(Field_IcGrid2D), intent(in) :: num_field 00127 real(DP) normVal 00128 00129 ! 作業変数 00130 ! Work variables 00131 ! 00132 integer :: EMin, EMax 00133 type(IcGrid2D_FVM), pointer :: icgrid 00134 00135 ! 実行文 ; Executable statements 00136 ! 00137 icgrid => get_icgrid(true_field) 00138 EMin = get_EffSize_Min(icgrid) 00139 EMax = get_EffSize_Max(icgrid) 00140 00141 normVal = calc_norm2( & 00142 & true_field%val(:,EMin:EMax, EMin:EMax, :), num_field%val(:,EMin:EMax, EMin:EMax, :) & 00143 & ) 00144 00145 end function numerical_error_norm2 00146 00147 ! 00166 function numerical_error_norminfinity( & 00167 & true_field, num_field, maxmin_info_flag & ! (in) 00168 & ) result(normVal) 00169 00170 ! 宣言文 ; Declaration statements 00171 ! 00172 type(Field_IcGrid2D), intent(in) :: true_field 00173 type(Field_IcGrid2D), intent(in) :: num_field 00174 logical, intent(in), optional :: maxmin_info_flag 00175 real(DP) normVal 00176 00177 ! 作業変数 00178 ! Work variables 00179 ! 00180 integer :: EMin, EMax 00181 type(IcGrid2D_FVM), pointer :: icgrid 00182 logical :: info_flag 00183 00184 ! 実行文 ; Declaration statements 00185 ! 00186 icgrid => get_icgrid(true_field) 00187 EMin = get_EffSize_Min(icgrid) 00188 EMax = get_EffSize_Max(icgrid) 00189 00190 if ( present(maxmin_info_flag) .and. maxmin_info_flag ) then 00191 info_flag = .true. 00192 else 00193 info_flag = .false. 00194 end if 00195 00196 normVal = calc_norm3( & 00197 & true_field%val(:,EMin:EMax, EMin:EMax, :), num_field%val(:,EMin:EMax, EMin:EMax, :), & 00198 & output_info_flag=info_flag ) 00199 00200 end function numerical_error_norminfinity 00201 00202 end module Field_IcGrid2D_error_norm_check