IGMBaseLib 1.0
|
00001 00013 module rcregions_norm_check 00014 00015 ! モジュール引用 ; Use statement 00016 ! 00017 use dc_types, only: DP ! 倍精度実数型. Double precision. 00018 00019 ! 宣言文 ; Declaration statement 00020 ! 00021 implicit none 00022 private 00023 00024 ! 公開手続き 00025 ! Public procedure 00026 ! 00027 public calc_norm1, calc_norm2, calc_norm3 00028 00029 ! 公開変数 00030 ! Public variables 00031 ! 00032 integer, parameter :: RC_REGIONS_NUM = 10 00033 00034 contains 00035 00036 ! 00037 ! 00038 ! 00039 function calc_norm1(true_field, num_field) result(normVal) 00040 ! 宣言文 ; Declaration statements 00041 ! 00042 real(DP), intent(in) :: true_field(:,:,:,:) 00043 real(DP), intent(in) :: num_field(:,:,:,:) 00044 real(DP) normVal 00045 00046 ! 作業変数 00047 ! Work varaibles 00048 ! 00049 real(DP) fieldT_sum 00050 real(DP) fieldError_sum 00051 integer :: rcID, i,j 00052 integer :: EMax 00053 00054 ! 実行文 ; Executable statements 00055 ! 00056 00057 EMax = size(true_field, 2) 00058 fieldT_sum = 0.0d0 00059 fieldError_sum = 0.0d0 00060 00061 do rcID=1, RC_REGIONS_NUM 00062 do j=1,EMax-1 00063 do i=2,EMax 00064 fieldError_sum = fieldError_sum + abs_Val(true_field(rcID,i,j,:) - num_field(rcID, i,j, :)) 00065 fieldT_sum = fieldT_sum + abs_Val(true_field(rcID,i,j,:)) 00066 00067 end do 00068 end do 00069 end do 00070 00071 fieldError_sum = fieldError_sum + abs_Val(true_field(1,1,1,:) - num_field(1,1,1, :)) 00072 fieldT_sum = fieldT_sum + abs_Val(true_field(1,1,1,:)) 00073 00074 fieldError_sum = fieldError_sum + abs_Val(true_field(6,EMax,EMax,:) - num_field(6,EMax,EMax, :)) 00075 fieldT_sum = fieldT_sum + abs_Val(true_field(6,EMax,EMax,:)) 00076 00077 normVal = fieldError_sum / fieldT_sum 00078 00079 end function calc_norm1 00080 00081 ! 00085 function calc_norm2(true_field, num_field) result(normVal) 00086 ! 宣言文 ; Declaration statements 00087 ! 00088 real(DP), intent(in) :: true_field(:,:,:,:) 00089 real(DP), intent(in) :: num_field(:,:,:,:) 00090 real(DP) normVal 00091 00092 ! 作業変数 00093 ! Work varaibles 00094 ! 00095 real(DP) fieldT_sum 00096 real(DP) fieldError_sum 00097 integer :: rcID, i,j 00098 integer :: EMax 00099 00100 00101 ! 実行文 ; Executable statements 00102 ! 00103 00104 EMax = size(true_field, 2) 00105 fieldT_sum = 0.0d0 00106 fieldError_sum = 0.0d0 00107 00108 do rcID=1, RC_REGIONS_NUM 00109 do j=1,EMax-1 00110 do i=2,EMax 00111 fieldError_sum = fieldError_sum + abs_Val(true_field(rcID,i,j,:) - num_field(rcID, i,j, :))**2 00112 fieldT_sum = fieldT_sum + abs_Val(true_field(rcID,i,j,:))**2 00113 end do 00114 end do 00115 end do 00116 00117 fieldError_sum = fieldError_sum + abs_Val(true_field(1,1,1,:) - num_field(1,1,1, :))**2 00118 fieldT_sum = fieldT_sum + abs_Val(true_field(1,1,1,:))**2 00119 00120 fieldError_sum = fieldError_sum + abs_Val(true_field(6,EMax,EMax,:) - num_field(6,EMax,EMax, :))**2 00121 fieldT_sum = fieldT_sum + abs_Val(true_field(6,EMax,EMax,:))**2 00122 00123 normVal = dsqrt(fieldError_sum) / dsqrt(fieldT_sum) 00124 00125 end function calc_norm2 00126 00127 ! 00130 function calc_norm3(true_field, num_field, output_info_flag ) result(normVal) 00131 ! 宣言文 ; Declaration statements 00132 ! 00133 real(DP), intent(in) :: true_field(:,:,:,:) 00134 real(DP), intent(in) :: num_field(:,:,:,:) 00135 logical, intent(in), optional :: output_info_flag 00136 real(DP) normVal 00137 00138 ! 作業変数 00139 ! Work varaibles 00140 ! 00141 real(DP) :: fieldTMax 00142 real(DP) :: fieldErrorMax 00143 real(DP) absfieldError, absfieldT 00144 integer :: rcID, i,j 00145 00146 integer :: max_rcID, max_i, max_j 00147 integer :: EMax 00148 00149 ! 実行文 ; Executable statements 00150 ! 00151 00152 EMax = size(true_field, 2) 00153 fieldTMax = 0.0d0 00154 fieldErrorMax = 0.0d0 00155 max_rcID = 1; max_i = 1; max_j = 1 00156 00157 do rcID=1, RC_REGIONS_NUM 00158 do j=1,EMax 00159 do i=1,EMax 00160 00161 absfieldError = abs_Val(true_field(rcID,i,j,:) - num_field(rcID,i,j,:)) 00162 absfieldT = abs_Val(true_field(rcID,i,j,:)) 00163 00164 if( absfieldError >= fieldErrorMax ) then 00165 fieldErrorMax = absfieldError; 00166 max_rcID=rcID; max_i=i; max_j=j; 00167 end if 00168 00169 if( absfieldT > fieldTMax ) then 00170 fieldTMax = absfieldT 00171 ! write(*,*) rcID, i,j, absfieldError, absfieldT 00172 end if 00173 00174 end do 00175 end do 00176 end do 00177 00178 normVal = fieldErrorMax / fieldTMax 00179 00180 if ( present(output_info_flag) .and. output_info_flag ) then 00181 write(*,*) 'norm3 maximum error info:', max_rcID, max_i, max_j 00182 write(*,*) 'fieldTMax:', fieldTMax, ', true:', true_field(max_rcID,max_i,max_j,:), ', num:', num_field(max_rcID,max_i,max_j,:) 00183 end if 00184 end function calc_norm3 00185 00186 function abs_Val(errorVal) result(absVal) 00187 ! 00188 ! 00189 ! 00190 real(DP), intent(in) :: errorVal(:) 00191 real(DP)absVal 00192 00193 integer :: valDim 00194 valDim = size(errorVal, 1) 00195 00196 if( valDim == 1 )then 00197 absVal = dabs(errorVal(1)) 00198 else if( valDim == 3 ) then 00199 absVal = dsqrt(dot_product(errorVal, errorVal)) 00200 else 00201 absVal = 0.0d0 00202 write(*,*) '!!!!!!!!!!!!!!!!!!!!!!!' 00203 end if 00204 00205 end function abs_Val 00206 00207 end module rcregions_norm_check