Commit ca8ab9e90b29cfc11d3d1b8358076c5512aa66f5
1 parent
ca596cf4
Exists in
proximity_effects
Update to proximity effects: working for simple cases
Showing
34 changed files
with
1548 additions
and
81 deletions
Show diff stats
PROXIMITY_EFFECT_TEST_CASES/TWO_WIRE/TWO_WIRE/single_wire.cable_spec
| ... | ... | @@ -5,7 +5,7 @@ Cylindrical |
| 5 | 5 | 3 # number of parameters |
| 6 | 6 | 1.0000E-04 # parameter 1: conductor radius |
| 7 | 7 | 1.0000E-04 # parameter 2: dielectric radius |
| 8 | - 0.0000E+00 # parameter 3: conductivity | |
| 8 | + 4.461E+07 # parameter 3: conductivity | |
| 9 | 9 | 1 # number of frequency dependent parameters |
| 10 | 10 | # Dielectric relative permittivity model follows |
| 11 | 11 | 1.0000000000000000 # w normalisation constant | ... | ... |
PROXIMITY_EFFECT_TEST_CASES/TWO_WIRE/TWO_WIRE_FASTHENRY/single_wire.cable_spec
| ... | ... | @@ -5,7 +5,7 @@ Cylindrical |
| 5 | 5 | 3 # number of parameters |
| 6 | 6 | 1.0000E-04 # parameter 1: conductor radius |
| 7 | 7 | 1.0000E-04 # parameter 2: dielectric radius |
| 8 | - 0.0000E+00 # parameter 3: conductivity | |
| 8 | + 4.461E+07 # parameter 3: conductivity | |
| 9 | 9 | 1 # number of frequency dependent parameters |
| 10 | 10 | # Dielectric relative permittivity model follows |
| 11 | 11 | 1.0000000000000000 # w normalisation constant | ... | ... |
PROXIMITY_EFFECT_TEST_CASES/TWO_WIRE/TWO_WIRE_FASTHENRY/two_wire.bundle_spec
PROXIMITY_EFFECT_TEST_CASES/TWO_WIRE/TWO_WIRE_FASTHENRY/two_wire_ac.spice_model_spec
| ... | ... | @@ -31,3 +31,8 @@ log # frequency scale (log or lin) |
| 31 | 31 | # Output conductor number and end number |
| 32 | 32 | 1 1 |
| 33 | 33 | lin # output type (lin or dB) |
| 34 | +-10 # order for vector fit model | |
| 35 | +log # frequency scale (log or lin) | |
| 36 | +1e2 1e8 60 # fmin fmax number_of_frequencies | |
| 37 | +verbose | |
| 38 | +plot_propagation_correction_filter_fit_data | ... | ... |
PROXIMITY_EFFECT_TEST_CASES/TWO_WIRE/TWO_WIRE_LAPLACE/single_wire.cable_spec
| ... | ... | @@ -5,7 +5,7 @@ Cylindrical |
| 5 | 5 | 3 # number of parameters |
| 6 | 6 | 1.0000E-04 # parameter 1: conductor radius |
| 7 | 7 | 1.0000E-04 # parameter 2: dielectric radius |
| 8 | - 0.0000E+00 # parameter 3: conductivity | |
| 8 | + 4.461E+07 # parameter 3: conductivity | |
| 9 | 9 | 1 # number of frequency dependent parameters |
| 10 | 10 | # Dielectric relative permittivity model follows |
| 11 | 11 | 1.0000000000000000 # w normalisation constant | ... | ... |
PROXIMITY_EFFECT_TEST_CASES/TWO_WIRE/plot_comparison.plt
| ... | ... | @@ -5,6 +5,7 @@ set xlabel 'Frequency(Hz)' |
| 5 | 5 | set ylabel 'V(f)' |
| 6 | 6 | set logscale x |
| 7 | 7 | plot './TWO_WIRE/RUN_DIRECTORY/analytic_solution.dat' u 1:2 title 'Analytic solution' w p lc 3,\ |
| 8 | + './TWO_WIRE_FASTHENRY/RUN_DIRECTORY/analytic_solution.dat' u 1:2 title 'Analytic solution2' w p lc 3,\ | |
| 8 | 9 | './TWO_WIRE/RUN_DIRECTORY/spice_solution.dat' u 2:3 title 'TWO_WIRE' w l lc 1,\ |
| 9 | 10 | './TWO_WIRE_LAPLACE/RUN_DIRECTORY/spice_solution.dat' u 2:3 title 'TWO_WIRE_LAPLACE' w l lc 2,\ |
| 10 | 11 | './TWO_WIRE_FASTHENRY/RUN_DIRECTORY/spice_solution.dat' u 2:3 title 'TWO_WIRE_FASTHENRY' w l lc 4 | ... | ... |
PROXIMITY_EFFECT_TEST_CASES/TWO_WIRE/status
PROXIMITY_EFFECT_TEST_CASES/WIRE_OVER_GP/WIRE_OVER_GROUND_PLANE_FASTHENRY/single_wire.cable_spec
| ... | ... | @@ -5,7 +5,7 @@ Cylindrical |
| 5 | 5 | 3 # number of parameters |
| 6 | 6 | 1.0000E-04 # parameter 1: conductor radius |
| 7 | 7 | 1.0000E-04 # parameter 2: dielectric radius |
| 8 | - 0.0000E+00 # parameter 3: conductivity | |
| 8 | + 4.461E+07 # parameter 3: conductivity | |
| 9 | 9 | 1 # number of frequency dependent parameters |
| 10 | 10 | # Dielectric relative permittivity model follows |
| 11 | 11 | 1.0000000000000000 # w normalisation constant | ... | ... |
PROXIMITY_EFFECT_TEST_CASES/WIRE_OVER_GP/WIRE_OVER_GROUND_PLANE_FASTHENRY/wire_over_ground.bundle_spec
| ... | ... | @@ -5,11 +5,10 @@ |
| 5 | 5 | 1 # Number of cables in bundle, cable list follows: name then x,y of cable |
| 6 | 6 | single_wire |
| 7 | 7 | 0.0 4.e-3 ! x and y coordinates of the cable centre |
| 8 | -ground_plane | |
| 8 | +ground_plane 4.461E+07 25e-3 0.1e-3 10 10 1 ! sigma w h nx nz nh | |
| 9 | 9 | -10 # order for vector fit model |
| 10 | 10 | log # frequency scale (log or lin) |
| 11 | -1e3 1e9 60 # fmin fmax number_of_frequencies | |
| 11 | +1e2 1e8 60 # fmin fmax number_of_frequencies | |
| 12 | 12 | verbose |
| 13 | 13 | use_laplace |
| 14 | -use_fasthenry | |
| 15 | - | |
| 14 | +use_fasthenry 4 3 3 2.0 2.0 ! condcutor meshing parameters: nlayers_radius nw nh rw rh | ... | ... |
PROXIMITY_EFFECT_TEST_CASES/WIRE_OVER_GP/WIRE_OVER_GROUND_PLANE_FASTHENRY/wire_over_ground_ac.spice_model_spec
| ... | ... | @@ -27,7 +27,12 @@ wire_over_ground |
| 27 | 27 | # Type of analysis |
| 28 | 28 | AC |
| 29 | 29 | log # frequency scale (log or lin) |
| 30 | -1e3 1e8 1000 # fmin fmax number_of_frequencies | |
| 30 | +1e3 1e8 1000 # fmin fmax number_of_frequencies 1e3 1e8 1000 # fmin fmax number_of_frequencies | |
| 31 | 31 | # Output conductor number and end number |
| 32 | 32 | 1 1 |
| 33 | 33 | lin # output type (lin or dB) |
| 34 | +-10 # order for vector fit model | |
| 35 | +log # frequency scale (log or lin) | |
| 36 | +1e2 1e8 60 # fmin fmax number_of_frequencies | |
| 37 | +verbose | |
| 38 | +plot_propagation_correction_filter_fit_data | ... | ... |
PROXIMITY_EFFECT_TEST_CASES/WIRE_OVER_GP/status
| 1 | -generate_spice_cable_bundle_model clean | |
| 1 | +generate_spice_cable_bundle_model plot | |
| 2 | 2 | |
| 3 | -WIRE_OVER_GROUND_PLANE: Finished correctly | |
| 4 | -WIRE_OVER_GROUND_PLANE_LAPLACE: Finished correctly | |
| 5 | -WIRE_OVER_GROUND_PLANE_FASTHENRY: Finished correctly | |
| 3 | +WIRE_OVER_GROUND_PLANE_FASTHENRY/: Finished correctly | ... | ... |
SRC/BUNDLE_DOMAIN_CREATION/create_global_domain_structure.F90
| ... | ... | @@ -1035,6 +1035,8 @@ USE maths |
| 1035 | 1035 | PUL%y(conductor)=bundle%cable_y_offset(cable) |
| 1036 | 1036 | PUL%rtheta(conductor)=bundle%cable_angle(cable) |
| 1037 | 1037 | |
| 1038 | + PUL%sigma(conductor)=bundle%cable(cable)%external_model(local_conductor)%conductor_sigma | |
| 1039 | + | |
| 1038 | 1040 | PUL%ox(conductor)=bundle%cable(cable)%external_model(local_conductor)%conductor_ox |
| 1039 | 1041 | PUL%oy(conductor)=bundle%cable(cable)%external_model(local_conductor)%conductor_oy |
| 1040 | 1042 | PUL%r(conductor)=bundle%cable(cable)%external_model(local_conductor)%conductor_radius |
| ... | ... | @@ -1064,12 +1066,19 @@ USE maths |
| 1064 | 1066 | |
| 1065 | 1067 | overshield=overshield+1 |
| 1066 | 1068 | |
| 1067 | - if (verbose) write(*,*)'PUL parameter calculation for oversheild domain' | |
| 1069 | + if (verbose) write(*,*)'PUL parameter calculation for overshield domain' | |
| 1068 | 1070 | ! no ground plane |
| 1069 | 1071 | PUL%ground_plane_present=.FALSE. |
| 1070 | 1072 | PUL%ground_plane_angle =0d0 |
| 1071 | 1073 | PUL%ground_plane_offset =0d0 |
| 1072 | - | |
| 1074 | + PUL%ground_plane_sigma =0d0 | |
| 1075 | + PUL%ground_plane_w =0d0 | |
| 1076 | + PUL%ground_plane_h =0d0 | |
| 1077 | + PUL%ground_plane_Rdc =0d0 | |
| 1078 | + PUL%ground_plane_nsegx =0 | |
| 1079 | + PUL%ground_plane_nsegz =0 | |
| 1080 | + PUL%ground_plane_nh =0 | |
| 1081 | + | |
| 1073 | 1082 | ! add overshield information |
| 1074 | 1083 | if (verbose) write(*,*)'Add overshield information' |
| 1075 | 1084 | is_overshield_domain=.TRUE. |
| ... | ... | @@ -1080,7 +1089,7 @@ USE maths |
| 1080 | 1089 | PUL%overshield_y = overshield_y(overshield) |
| 1081 | 1090 | PUL%overshield_r = overshield_r(overshield) |
| 1082 | 1091 | PUL%overshield_w = overshield_w(overshield) |
| 1083 | - PUL%overshield_w2 = overshield_w2(overshield) | |
| 1092 | + PUL%overshield_w2= overshield_w2(overshield) | |
| 1084 | 1093 | PUL%overshield_h = overshield_h(overshield) |
| 1085 | 1094 | |
| 1086 | 1095 | PUL%epsr_background = 1d0 ! background permittivity =1.0 within an overshield i.e. cables are in air |
| ... | ... | @@ -1109,14 +1118,21 @@ USE maths |
| 1109 | 1118 | PUL%ground_plane_present=bundle%ground_plane_present |
| 1110 | 1119 | PUL%ground_plane_angle =bundle%ground_plane_angle |
| 1111 | 1120 | PUL%ground_plane_offset =bundle%ground_plane_offset |
| 1112 | - | |
| 1121 | + PUL%ground_plane_sigma =bundle%ground_plane_sigma ! ground plane conductivity | |
| 1122 | + PUL%ground_plane_w =bundle%ground_plane_w ! ground plane width | |
| 1123 | + PUL%ground_plane_h =bundle%ground_plane_h ! ground plane height | |
| 1124 | + PUL%ground_plane_Rdc =bundle%ground_plane_Rdc ! ground plane dc resistance | |
| 1125 | + PUL%ground_plane_nsegx =bundle%ground_plane_nsegx ! ground plane x discretisation | |
| 1126 | + PUL%ground_plane_nsegz =bundle%ground_plane_nsegz ! ground plane z discretisation | |
| 1127 | + PUL%ground_plane_nh =bundle%ground_plane_nh ! ground plane h discretisation | |
| 1128 | + | |
| 1113 | 1129 | ! No overshield information |
| 1114 | 1130 | is_overshield_domain=.FALSE. |
| 1115 | 1131 | PUL%overshield_present=.FALSE. |
| 1116 | 1132 | PUL%overshield_shape=0 |
| 1117 | 1133 | PUL%overshield_r= 0d0 |
| 1118 | 1134 | PUL%overshield_w= 0d0 |
| 1119 | - PUL%overshield_w2= 0d0 | |
| 1135 | + PUL%overshield_w2=0d0 | |
| 1120 | 1136 | PUL%overshield_h= 0d0 |
| 1121 | 1137 | |
| 1122 | 1138 | PUL%epsr_background = 1d0 ! background permittivity =1.0 i.e. cables are in air |
| ... | ... | @@ -1134,6 +1150,10 @@ USE maths |
| 1134 | 1150 | if (use_FastHenry) then |
| 1135 | 1151 | |
| 1136 | 1152 | CALL PUL_RL_FastHenry2(PUL,bundle%bundle_name,bundle%Y_fit_model_order,bundle%Y_fit_freq_spec,domain) |
| 1153 | + | |
| 1154 | +!! Change the conductor model type as we now let FastHenry2 deal with this. | |
| 1155 | +! bundle%cable(cable)%conductor_impedance(local_conductor)%impedance_model_type=impedance_model_type_FH2 | |
| 1156 | +! bundle%cable(cable)%conductor_impedance(local_conductor)%Rdc, | |
| 1137 | 1157 | |
| 1138 | 1158 | end if |
| 1139 | 1159 | |
| ... | ... | @@ -1278,11 +1298,12 @@ USE maths |
| 1278 | 1298 | |
| 1279 | 1299 | conductor=conductor+1 |
| 1280 | 1300 | ! copy the conductor impedance model for this cable conductor to the bundle structure |
| 1301 | + | |
| 1302 | + write(*,*)'cable=',cable,' conductor=',conductor,' local_conductor=',local_conductor | |
| 1281 | 1303 | |
| 1282 | 1304 | bundle%conductor_impedance(conductor)%impedance_model_type= & |
| 1283 | 1305 | bundle%cable(cable)%conductor_impedance(local_conductor)%impedance_model_type |
| 1284 | 1306 | |
| 1285 | - | |
| 1286 | 1307 | bundle%conductor_impedance(conductor)%radius= & |
| 1287 | 1308 | bundle%cable(cable)%conductor_impedance(local_conductor)%radius |
| 1288 | 1309 | |
| ... | ... | @@ -1300,6 +1321,9 @@ USE maths |
| 1300 | 1321 | |
| 1301 | 1322 | bundle%conductor_impedance(conductor)%Resistance_multiplication_factor= & |
| 1302 | 1323 | bundle%cable(cable)%conductor_impedance(local_conductor)%Resistance_multiplication_factor |
| 1324 | + | |
| 1325 | + bundle%conductor_impedance(conductor)%Rdc= & | |
| 1326 | + bundle%cable(cable)%conductor_impedance(local_conductor)%Rdc | |
| 1303 | 1327 | |
| 1304 | 1328 | if((bundle%conductor_impedance(conductor)%impedance_model_type.EQ.impedance_model_type_filter).OR. & |
| 1305 | 1329 | (bundle%conductor_impedance(conductor)%impedance_model_type.EQ.impedance_model_type_cylindrical_shield)) then | ... | ... |
SRC/CABLE_BUNDLE_MODULES/cable_bundle_module.F90
| ... | ... | @@ -101,6 +101,14 @@ TYPE::bundle_specification_type |
| 101 | 101 | real(dp) :: ground_plane_angle |
| 102 | 102 | real(dp) :: ground_plane_offset |
| 103 | 103 | |
| 104 | + real(dp) :: ground_plane_sigma ! ground plane conductivity for FastHenry2 | |
| 105 | + real(dp) :: ground_plane_w ! ground plane width for FastHenry2 | |
| 106 | + real(dp) :: ground_plane_h ! ground plane height for FastHenry2 | |
| 107 | + real(dp) :: ground_plane_Rdc ! ground plane dc resistance for FastHenry2 | |
| 108 | + integer :: ground_plane_nsegx ! ground plane number of segments in x for FastHenry2 | |
| 109 | + integer :: ground_plane_nsegz ! ground plane number of segments in z for FastHenry2 | |
| 110 | + integer :: ground_plane_nh ! ground plane number of layers in h for FastHenry2 | |
| 111 | + | |
| 104 | 112 | real(dp) :: ground_plane_x,ground_plane_y,ground_plane_theta |
| 105 | 113 | real(dp) :: ground_plane_nx,ground_plane_ny |
| 106 | 114 | |
| ... | ... | @@ -270,6 +278,20 @@ CONTAINS |
| 270 | 278 | ! calculate offset |
| 271 | 279 | bundle%ground_plane_offset=-bundle%ground_plane_x*sin(bundle%ground_plane_angle)+ & |
| 272 | 280 | bundle%ground_plane_y*cos(bundle%ground_plane_angle) |
| 281 | + | |
| 282 | + read(file_unit,*,IOSTAT=ierr)bundle%ground_plane_sigma | |
| 283 | + read(file_unit,*,IOSTAT=ierr)bundle%ground_plane_w | |
| 284 | + read(file_unit,*,IOSTAT=ierr)bundle%ground_plane_h | |
| 285 | + read(file_unit,*,IOSTAT=ierr)bundle%ground_plane_Rdc | |
| 286 | + read(file_unit,*,IOSTAT=ierr)bundle%ground_plane_nsegx | |
| 287 | + read(file_unit,*,IOSTAT=ierr)bundle%ground_plane_nsegz | |
| 288 | + read(file_unit,*,IOSTAT=ierr)bundle%ground_plane_nh | |
| 289 | + | |
| 290 | + if (ierr.NE.0) then | |
| 291 | + run_status='ERROR reading ground plane sigma, w h and Rdc' | |
| 292 | + CALL write_program_status() | |
| 293 | + STOP 1 | |
| 294 | + end if | |
| 273 | 295 | |
| 274 | 296 | ! set the geometric data for the last cable in the list i.e. the ground plane |
| 275 | 297 | |
| ... | ... | @@ -508,6 +530,15 @@ CONTAINS |
| 508 | 530 | ' x y coordinates and angle of ground plane ' |
| 509 | 531 | write(file_unit,*)bundle%ground_plane_nx,bundle%ground_plane_ny,' ground plane normal direction' |
| 510 | 532 | write(file_unit,*)bundle%ground_plane_cable_side,' orientation of cables wrt ground plane' |
| 533 | + | |
| 534 | + write(file_unit,*)bundle%ground_plane_sigma,' ground plane conductivity' | |
| 535 | + write(file_unit,*)bundle%ground_plane_w,' ground plane width ' | |
| 536 | + write(file_unit,*)bundle%ground_plane_h,' ground plane height (thickness) ' | |
| 537 | + write(file_unit,*)bundle%ground_plane_Rdc,' ground plane Rdc ' | |
| 538 | + write(file_unit,*)bundle%ground_plane_nsegx,' ground plane nsegx ' | |
| 539 | + write(file_unit,*)bundle%ground_plane_nsegz,' ground plane nsegz ' | |
| 540 | + write(file_unit,*)bundle%ground_plane_nh,' ground plane nh ' | |
| 541 | + | |
| 511 | 542 | else |
| 512 | 543 | write(file_unit,'(A)')'no_ground_plane' |
| 513 | 544 | end if | ... | ... |
SRC/CABLE_MODULES/cable_module.F90
| ... | ... | @@ -126,6 +126,7 @@ |
| 126 | 126 | ! put the external condcutor model information into its own structure 6/10/2016 CJS |
| 127 | 127 | ! 16/11/2017 CJS Include network synthesis process to replace s-domain transfer functions |
| 128 | 128 | ! 16/3/2018 CJS Add ML_flex_cable |
| 129 | +! 24/10/2023 CJS Add impedance_model_type_FH2 | |
| 129 | 130 | ! |
| 130 | 131 | MODULE cable_module |
| 131 | 132 | |
| ... | ... | @@ -146,6 +147,7 @@ TYPE:: conductor_impedance_model |
| 146 | 147 | ! impedance_model_type_cylidrical_shell_with_conductivity |
| 147 | 148 | ! impedance_model_type_cylindrical_shield |
| 148 | 149 | ! impedance_model_type_rectangular_with_conductivity |
| 150 | +! impedance_model_type_FH2 | |
| 149 | 151 | |
| 150 | 152 | integer :: impedance_model_type |
| 151 | 153 | |
| ... | ... | @@ -173,6 +175,7 @@ TYPE:: external_conductor_model |
| 173 | 175 | |
| 174 | 176 | integer :: conductor_type |
| 175 | 177 | real(dp) :: conductor_radius |
| 178 | + real(dp) :: conductor_sigma | |
| 176 | 179 | real(dp) :: conductor_width |
| 177 | 180 | real(dp) :: conductor_width2 |
| 178 | 181 | real(dp) :: conductor_height |
| ... | ... | @@ -277,6 +280,7 @@ integer,parameter :: impedance_model_type_filter |
| 277 | 280 | integer,parameter :: impedance_model_type_cylidrical_shell_with_conductivity =3 |
| 278 | 281 | integer,parameter :: impedance_model_type_cylindrical_shield =4 |
| 279 | 282 | integer,parameter :: impedance_model_type_rectangular_with_conductivity =5 |
| 283 | +integer,parameter :: impedance_model_type_FH2 =6 | |
| 280 | 284 | |
| 281 | 285 | CONTAINS |
| 282 | 286 | |
| ... | ... | @@ -335,6 +339,7 @@ include 'conductor_impedance_model.F90' |
| 335 | 339 | |
| 336 | 340 | ext_model%conductor_type=0d0 |
| 337 | 341 | ext_model%conductor_radius=0d0 |
| 342 | + ext_model%conductor_sigma=0d0 | |
| 338 | 343 | ext_model%conductor_width=0d0 |
| 339 | 344 | ext_model%conductor_width2=0d0 |
| 340 | 345 | ext_model%conductor_height=0d0 |
| ... | ... | @@ -512,6 +517,7 @@ END SUBROUTINE reset_external_conductor_model |
| 512 | 517 | do i=1,cable%n_external_conductors |
| 513 | 518 | read(file_unit,*) cable%external_model(i)%conductor_type |
| 514 | 519 | read(file_unit,*) cable%external_model(i)%conductor_radius |
| 520 | + read(file_unit,*) cable%external_model(i)%conductor_sigma | |
| 515 | 521 | read(file_unit,*) cable%external_model(i)%conductor_width |
| 516 | 522 | read(file_unit,*) cable%external_model(i)%conductor_width2 |
| 517 | 523 | read(file_unit,*) cable%external_model(i)%conductor_height |
| ... | ... | @@ -703,6 +709,7 @@ END SUBROUTINE reset_external_conductor_model |
| 703 | 709 | do i=1,cable%n_external_conductors |
| 704 | 710 | write(file_unit,*) cable%external_model(i)%conductor_type,' conductor type' |
| 705 | 711 | write(file_unit,*) cable%external_model(i)%conductor_radius ,' conductor_radius ' |
| 712 | + write(file_unit,*) cable%external_model(i)%conductor_sigma ,' conductor_sigma ' | |
| 706 | 713 | write(file_unit,*) cable%external_model(i)%conductor_width ,' conductor_width ' |
| 707 | 714 | write(file_unit,*) cable%external_model(i)%conductor_width2 ,' conductor_width2 ' |
| 708 | 715 | write(file_unit,*) cable%external_model(i)%conductor_height ,' conductor_height ' | ... | ... |
SRC/CABLE_MODULES/coax.F90
| ... | ... | @@ -245,6 +245,7 @@ IMPLICIT NONE |
| 245 | 245 | CALL reset_external_conductor_model(cable%external_model(1)) |
| 246 | 246 | cable%external_model(1)%conductor_type=circle |
| 247 | 247 | cable%external_model(1)%conductor_radius=rs |
| 248 | + cable%external_model(1)%conductor_sigma=sigma_s | |
| 248 | 249 | cable%external_model(1)%dielectric_radius=rd |
| 249 | 250 | cable%external_model(1)%dielectric_epsr=epsr2 |
| 250 | 251 | ... | ... |
SRC/CABLE_MODULES/conductor_impedance_model.F90
| ... | ... | @@ -39,6 +39,7 @@ |
| 39 | 39 | ! impedance_model_type_cylidrical_shell_with_conductivity |
| 40 | 40 | ! impedance_model_type_cylindrical_shield |
| 41 | 41 | ! impedance_model_type_rectangular_with_conductivity |
| 42 | +! impedance_model_type_FH2 | |
| 42 | 43 | |
| 43 | 44 | ! File Contents: |
| 44 | 45 | ! SUBROUTINE read_conductor_impedance_model |
| ... | ... | @@ -133,6 +134,10 @@ IMPLICIT NONE |
| 133 | 134 | read(unit,*,ERR=9000)conductor_impedance%height |
| 134 | 135 | read(unit,*,ERR=9000)conductor_impedance%conductivity |
| 135 | 136 | read(unit,*,ERR=9000)conductor_impedance%Resistance_multiplication_factor |
| 137 | + | |
| 138 | + else if (conductor_impedance%impedance_model_type.EQ.impedance_model_type_FH2) then | |
| 139 | + | |
| 140 | + read(unit,*,ERR=9000)conductor_impedance%Rdc | |
| 136 | 141 | |
| 137 | 142 | else |
| 138 | 143 | |
| ... | ... | @@ -224,6 +229,10 @@ IMPLICIT NONE |
| 224 | 229 | write(unit,*)conductor_impedance%height,' # conductor height' |
| 225 | 230 | write(unit,*)conductor_impedance%conductivity,' # conductivity' |
| 226 | 231 | write(unit,*)conductor_impedance%Resistance_multiplication_factor,' # Resistance_multiplication_factor' |
| 232 | + | |
| 233 | + else if (conductor_impedance%impedance_model_type.EQ.impedance_model_type_FH2) then | |
| 234 | + | |
| 235 | + write(unit,*)conductor_impedance%Rdc,' # conductor dc resistance' | |
| 227 | 236 | |
| 228 | 237 | end if |
| 229 | 238 | |
| ... | ... | @@ -344,6 +353,13 @@ IMPLICIT NONE |
| 344 | 353 | t=conductor_impedance%height |
| 345 | 354 | |
| 346 | 355 | CALL calculate_internal_impedance_rectangular(sigma,w,t,f,Z_c,Rdc_c) |
| 356 | + | |
| 357 | + else if (conductor_impedance%impedance_model_type.EQ.impedance_model_type_FH2) then | |
| 358 | + | |
| 359 | + Z_c=conductor_impedance%Rdc | |
| 360 | + Rdc_c=conductor_impedance%Rdc | |
| 361 | + Z_t=(0d0,0d0) | |
| 362 | + Rdc_t=0d0 | |
| 347 | 363 | |
| 348 | 364 | end if |
| 349 | 365 | ... | ... |
SRC/CABLE_MODULES/cylindrical.F90
| ... | ... | @@ -174,6 +174,7 @@ IMPLICIT NONE |
| 174 | 174 | CALL reset_external_conductor_model(cable%external_model(1)) |
| 175 | 175 | cable%external_model(1)%conductor_type=circle |
| 176 | 176 | cable%external_model(1)%conductor_radius=r |
| 177 | + cable%external_model(1)%conductor_sigma=sigma | |
| 177 | 178 | cable%external_model(1)%dielectric_radius=rd |
| 178 | 179 | cable%external_model(1)%dielectric_epsr=epsr |
| 179 | 180 | ... | ... |
SRC/CREATE_SPICE_CIRCUIT_MODEL/create_spice_subcircuit_model.F90
| ... | ... | @@ -57,7 +57,7 @@ |
| 57 | 57 | ! |
| 58 | 58 | ! STAGE_9, generate the information required for and then write the transfer impedance coupling model(s) as required |
| 59 | 59 | ! STAGE_10, generate the information required for and then write the incident field excitation model as required |
| 60 | -! STAGE 11: Dallocate the domain based information | |
| 60 | +! STAGE 11: Deallocate the domain based information | |
| 61 | 61 | ! |
| 62 | 62 | ! COMMENTS |
| 63 | 63 | ! 1. The notation needs to be organised a bit better. | ... | ... |
SRC/GENERAL_MODULES/frequency_spec.F90
| ... | ... | @@ -69,6 +69,7 @@ real(dp) :: fmin ! minimum frequency |
| 69 | 69 | real(dp) :: fmax ! maximum frequency |
| 70 | 70 | integer :: n_frequencies ! number of frequencies |
| 71 | 71 | real(dp),allocatable ::freq_list(:)! list of frequencies |
| 72 | +real(dp) :: ndec ! number of frequencies per decade: used in FastHenry2 | |
| 72 | 73 | |
| 73 | 74 | END TYPE frequency_specification |
| 74 | 75 | |
| ... | ... | @@ -247,12 +248,16 @@ integer :: ierr |
| 247 | 248 | log_fstep=(log_fmax-log_fmin)/dble(freq_data%n_frequencies-1) |
| 248 | 249 | end if |
| 249 | 250 | |
| 251 | + freq_data%ndec=dble(freq_data%n_frequencies-1)/log10(freq_data%fmax/freq_data%fmin) | |
| 252 | + | |
| 250 | 253 | else if (freq_data%freq_range_type.EQ.'lin') then |
| 251 | 254 | |
| 252 | 255 | fstep=0d0 ! this is the value used if freq_data%n_frequencies=1 |
| 253 | 256 | if (freq_data%n_frequencies.ne.1) then |
| 254 | 257 | fstep=(freq_data%fmax-freq_data%fmin)/dble(freq_data%n_frequencies-1) |
| 255 | 258 | end if |
| 259 | + | |
| 260 | + freq_data%ndec=0d0 | |
| 256 | 261 | |
| 257 | 262 | else |
| 258 | 263 | ... | ... |
SRC/GENERAL_MODULES/general_module.F90
| ... | ... | @@ -267,6 +267,14 @@ integer,parameter :: local_file_unit=90 |
| 267 | 267 | |
| 268 | 268 | integer,parameter :: temp_file_unit=99 |
| 269 | 269 | |
| 270 | +! FastHenry2 default conductor meshing parameters | |
| 271 | + | |
| 272 | +integer :: FH2_nlayers_radius=4 | |
| 273 | +integer :: FH2_nw=3 | |
| 274 | +integer :: FH2_nh=3 | |
| 275 | +real(dp):: FH2_rw=2.0 | |
| 276 | +real(dp):: FH2_rh=2.0 | |
| 277 | + | |
| 270 | 278 | CONTAINS |
| 271 | 279 | |
| 272 | 280 | include 'add_integer_to_string.F90' | ... | ... |
SRC/MTL_ANALYTIC_SOLUTION/frequency_domain_analysis.F90
| ... | ... | @@ -278,7 +278,7 @@ integer :: ierr ! error code for matrix inverse calls |
| 278 | 278 | end do ! next col |
| 279 | 279 | end do ! next row |
| 280 | 280 | |
| 281 | -! calculate the contribution to the matrices from the conductor based impedance models. Initailly set to zero | |
| 281 | +! calculate the contribution to the matrices from the conductor based impedance models. Initially set to zero | |
| 282 | 282 | ! See Theory_Manual_Section 2.2.3 |
| 283 | 283 | |
| 284 | 284 | Z_domain_conductor_impedance_correction(1:dim,1:dim)=(0d0,0d0) |
| ... | ... | @@ -479,7 +479,7 @@ integer :: ierr ! error code for matrix inverse calls |
| 479 | 479 | |
| 480 | 480 | ! Add the conductor impedance contributions to the domain based impedance matrix |
| 481 | 481 | Z_domain(:,:)=Z_domain(:,:)+Z_domain_conductor_impedance_correction(:,:) |
| 482 | - | |
| 482 | + | |
| 483 | 483 | if (verbose) then |
| 484 | 484 | |
| 485 | 485 | write(*,*)'[R_domain]=Re[Z_domain]' | ... | ... |
SRC/MTL_ANALYTIC_SOLUTION/propagation_correction_filters.F90
| ... | ... | @@ -173,7 +173,7 @@ integer :: ierr |
| 173 | 173 | ALLOCATE( Correction(1:dim,1:freq_spec%n_frequencies) ) |
| 174 | 174 | ALLOCATE( Hp(1:freq_spec%n_frequencies) ) |
| 175 | 175 | |
| 176 | -! if (plot_propagation_correction_filter_fit_data) then | |
| 176 | + if (plot_propagation_correction_filter_fit_data) then | |
| 177 | 177 | |
| 178 | 178 | ! open files for plotting the propagation correction functions |
| 179 | 179 | |
| ... | ... | @@ -206,7 +206,7 @@ integer :: ierr |
| 206 | 206 | |
| 207 | 207 | close(unit=80) |
| 208 | 208 | |
| 209 | -! end if ! plot_propagation_correction_filter_fit_data | |
| 209 | + end if ! plot_propagation_correction_filter_fit_data | |
| 210 | 210 | |
| 211 | 211 | ! loop over frequency working out the correction required for each mode at each frequency |
| 212 | 212 | ! Note we work downwards in frequency as we use high frequency values of L and C to define the |
| ... | ... | @@ -243,7 +243,7 @@ integer :: ierr |
| 243 | 243 | |
| 244 | 244 | end do ! next row |
| 245 | 245 | |
| 246 | -! Use the pre_calulcated delay (input to the subroutine) to obtain GAMMA_C_hf | |
| 246 | +! Use the pre_calculated delay (input to the subroutine) to obtain GAMMA_C_hf | |
| 247 | 247 | ! Theory_Manual_Eqns 3.81, 3.82, 3.83 |
| 248 | 248 | |
| 249 | 249 | GAMMA_C_hf(:)=j*w*delay(:)/length |
| ... | ... | @@ -422,9 +422,9 @@ integer :: ierr |
| 422 | 422 | |
| 423 | 423 | if (plot_propagation_correction_filter_fit_data) then |
| 424 | 424 | ! write propagation correction data for plotting |
| 425 | -! write(80+row,8000)f,real(Correction(row,frequency_loop)), & | |
| 426 | -! aimag(Correction(row,frequency_loop)),abs(Correction(row,frequency_loop)) | |
| 427 | - write(80+row,8000)f,real(GAMMA_C(local_mode)),aimag(GAMMA_C(local_mode)),real(GAMMA_C_hf(row)),aimag(GAMMA_C_hf(row)) | |
| 425 | + write(80+row,8000)f,real(Correction(row,frequency_loop)), & | |
| 426 | + aimag(Correction(row,frequency_loop)),abs(Correction(row,frequency_loop)) | |
| 427 | +! write(80+row,8000)f,real(GAMMA_C(local_mode)),aimag(GAMMA_C(local_mode)),real(GAMMA_C_hf(row)),aimag(GAMMA_C_hf(row)) | |
| 428 | 428 | end if |
| 429 | 429 | 8000 format(5E16.6) |
| 430 | 430 | |
| ... | ... | @@ -452,6 +452,7 @@ integer :: ierr |
| 452 | 452 | |
| 453 | 453 | ! Call the filter fitting process with this mode propagation correction data |
| 454 | 454 | ! with border=aorder and fit_type=1 i.e. Hfilter(f=0)=1 is imposed |
| 455 | + | |
| 455 | 456 | CALL Calculate_Sfilter(Hp,freq_spec%freq_list,freq_spec%n_frequencies,Hfilter(i),model_order,0,1) |
| 456 | 457 | |
| 457 | 458 | if (plot_propagation_correction_filter_fit_data) then |
| ... | ... | @@ -459,7 +460,10 @@ integer :: ierr |
| 459 | 460 | open(unit=80,file=trim(filename(i))//'_fit') |
| 460 | 461 | |
| 461 | 462 | do frequency_loop=1,freq_spec%n_frequencies |
| 462 | - | |
| 463 | + | |
| 464 | + f=freq_spec%freq_list(frequency_loop) | |
| 465 | +! shift the frequency from d.c. as jwL, jwC are zero at d.c. and this messes up the process | |
| 466 | + if (f.EQ.0d0) f=1d0 | |
| 463 | 467 | write(80,8010)f,evaluate_Sfilter_frequency_response(Hfilter(i),f) |
| 464 | 468 | 8010 format(3E16.6) |
| 465 | 469 | ... | ... |
SRC/Makefile
| ... | ... | @@ -199,7 +199,8 @@ cable_bundle_model_builder \ |
| 199 | 199 | spice_cable_bundle_model_builder \ |
| 200 | 200 | shield_conductor_and_transfer_impedance_model_builder \ |
| 201 | 201 | rational_function_fit \ |
| 202 | -compare_results | |
| 202 | +compare_results \ | |
| 203 | +write_FH_input_file | |
| 203 | 204 | |
| 204 | 205 | MAKE_COMPILATION_DATE: |
| 205 | 206 | echo "SPICE_CABLE_MODEL_BUILDER_compilation_date='$(COMPILATION_DATE)' " > compilation_date.inc |
| ... | ... | @@ -264,6 +265,11 @@ rational_function_fit: rational_function_fit.F90 $(MODS) |
| 264 | 265 | compare_results: compare_results.F90 $(TYPE_SPEC_MODULE) |
| 265 | 266 | $(FC) $(FLAGS) -o $(EXECUTABLE_DIR)/compare_results compare_results.F90 $(OBJS) $(LIBS) |
| 266 | 267 | |
| 268 | +write_FH_input_file: write_FH_input_file.F90 WRITE_FH2_IPFILE/create_grid.F90 \ | |
| 269 | + WRITE_FH2_IPFILE/get_grid_type.F90 \ | |
| 270 | + WRITE_FH2_IPFILE/set_segments_from_grid.F90 | |
| 271 | + $(FC) $(FLAGS) -o $(EXECUTABLE_DIR)/write_FH_input_file write_FH_input_file.F90 $(TYPE_SPEC_OBJS) | |
| 272 | + | |
| 267 | 273 | clean: |
| 268 | 274 | ( rm -f $(EXECUTABLE_DIR)/cable_model_builder* ) |
| 269 | 275 | ( rm -f $(EXECUTABLE_DIR)/cable_bundle_model_builder* ) |
| ... | ... | @@ -271,6 +277,7 @@ clean: |
| 271 | 277 | ( rm -f $(EXECUTABLE_DIR)/shield_conductor_and_transfer_impedance_model_builder* ) |
| 272 | 278 | ( rm -f $(EXECUTABLE_DIR)/rational_function_fit* ) |
| 273 | 279 | ( rm -f $(EXECUTABLE_DIR)/compare_results* ) |
| 280 | + ( rm -f $(EXECUTABLE_DIR)/write_FH_input_file* ) | |
| 274 | 281 | ( rm -f *.o ) |
| 275 | 282 | ( rm -f $(OBJ_MOD_DIR)/*.mod ) |
| 276 | 283 | ( rm -f $(OBJ_MOD_DIR)/*.o ) | ... | ... |
SRC/PUL_PARAMETER_CALCULATION/PUL_LC_Laplace.F90
| ... | ... | @@ -1237,10 +1237,9 @@ IMPLICIT NONE |
| 1237 | 1237 | |
| 1238 | 1238 | else |
| 1239 | 1239 | |
| 1240 | -! There are frequency dependent dielectrics or proximity effects present | |
| 1241 | -! Secondly we calculate the capacitance matrix at a number of frequencies before fitting filter functions | |
| 1240 | +! There are frequency dependent dielectrics present | |
| 1241 | +! We calculate the capacitance matrix at a number of frequencies before fitting filter functions | |
| 1242 | 1242 | ! to each of the frequency dependent admittance matrix entries. |
| 1243 | -! 23/10/2023: Call FastHenry2 for proximity effects if required | |
| 1244 | 1243 | |
| 1245 | 1244 | ! allocate the frequency dependent matrices |
| 1246 | 1245 | ALLOCATE( C_freq(1:freq_spec%n_frequencies) ) |
| ... | ... | @@ -1305,7 +1304,6 @@ IMPLICIT NONE |
| 1305 | 1304 | ! make the matrix symmetrical |
| 1306 | 1305 | PUL%Yfilter%sfilter_mat(col,row)=PUL%Yfilter%sfilter_mat(row,col) |
| 1307 | 1306 | PUL%Zfilter%sfilter_mat(col,row)=PUL%Zfilter%sfilter_mat(row,col) |
| 1308 | - | |
| 1309 | 1307 | end if |
| 1310 | 1308 | |
| 1311 | 1309 | end do ! next col |
| ... | ... | @@ -1341,7 +1339,6 @@ IMPLICIT NONE |
| 1341 | 1339 | CALL dwrite_matrix(PUL%C%mat,matrix_dimension,matrix_dimension,matrix_dimension,0) |
| 1342 | 1340 | write(*,*)'Conductance matrix, G' |
| 1343 | 1341 | CALL dwrite_matrix(PUL%G%mat,matrix_dimension,matrix_dimension,matrix_dimension,0) |
| 1344 | - | |
| 1345 | 1342 | end if |
| 1346 | 1343 | |
| 1347 | 1344 | if (allocated( dielectric_region_epsr )) DEALLOCATE( dielectric_region_epsr ) | ... | ... |
SRC/PUL_PARAMETER_CALCULATION/PUL_RL_FastHenry2.F90
| ... | ... | @@ -75,8 +75,6 @@ IMPLICIT NONE |
| 75 | 75 | integer,parameter :: outside=2 |
| 76 | 76 | |
| 77 | 77 | ! local variables |
| 78 | - | |
| 79 | - integer :: ndec | |
| 80 | 78 | |
| 81 | 79 | integer :: first_conductor,last_conductor,conductor |
| 82 | 80 | |
| ... | ... | @@ -85,6 +83,13 @@ IMPLICIT NONE |
| 85 | 83 | |
| 86 | 84 | ! Process_Zc variables: |
| 87 | 85 | |
| 86 | + integer :: matrix_dimension | |
| 87 | + | |
| 88 | + complex(dp),allocatable :: function_to_fit(:) ! complex function to be fitted using Sfilter_fit | |
| 89 | + | |
| 90 | + real(dp) :: ferr | |
| 91 | + | |
| 92 | + real(dp) :: gp_half_width | |
| 88 | 93 | |
| 89 | 94 | character(LEN=256) :: line |
| 90 | 95 | character(LEN=256) :: freq_and_dim_string |
| ... | ... | @@ -96,11 +101,13 @@ integer :: i |
| 96 | 101 | integer :: n_freq_in |
| 97 | 102 | |
| 98 | 103 | real(dp) :: freq,w |
| 99 | -integer :: nrows,ncols,r,c | |
| 104 | +integer :: nrows,ncols,r,c,row,col | |
| 100 | 105 | |
| 101 | 106 | complex(dp),allocatable :: Zc_in(:,:,:) |
| 102 | 107 | real(dp),allocatable :: freq_in(:) |
| 103 | 108 | |
| 109 | +real(dp),allocatable :: Rdc_domain(:,:) | |
| 110 | + | |
| 104 | 111 | real(dp),allocatable :: values(:),re,im |
| 105 | 112 | |
| 106 | 113 | logical :: subtract_dc_resistance |
| ... | ... | @@ -111,16 +118,25 @@ integer :: ierr |
| 111 | 118 | |
| 112 | 119 | |
| 113 | 120 | ! START |
| 114 | - if (verbose) write(*,*)'CALLED: PUL_LC_Laplace' | |
| 121 | + if (verbose) write(*,*)'CALLED: PUL_RL_FastHenry2' | |
| 115 | 122 | |
| 116 | -! STAGE 1: work out the configuration for the calculation i.e. is there a ground plane, is the outer boundary free space or a conductor (overshield) | |
| 123 | +! work out the local frequency sampling: FastHenry uses a specific form based on log frequency | |
| 124 | +! and number of samples per decade | |
| 117 | 125 | |
| 118 | 126 | write(*,*)'Filter fit order=',fit_order |
| 119 | 127 | write(*,*)'fmin=',freq_spec%fmin |
| 120 | 128 | write(*,*)'fmax=',freq_spec%fmax |
| 121 | - write(*,*)'n_frequencies=',freq_spec%n_frequencies | |
| 129 | + write(*,*)'n_frequencies=',freq_spec%n_frequencies | |
| 130 | + write(*,*)'ndec=',freq_spec%ndec | |
| 122 | 131 | |
| 123 | - ndec=NINT(real(freq_spec%n_frequencies)/log10(freq_spec%fmax/freq_spec%fmin)) | |
| 132 | + if (freq_spec%freq_range_type.EQ.'lin') then | |
| 133 | + write(run_status,*)'ERROR in PUL_RL_FastHenry2: We must have a logarithmic frequency range specified' | |
| 134 | + CALL write_program_status() | |
| 135 | + STOP 1 | |
| 136 | + | |
| 137 | + end if | |
| 138 | + | |
| 139 | +! STAGE 1: work out the configuration for the calculation i.e. is there a ground plane, is the outer boundary free space or a conductor (overshield) | |
| 124 | 140 | |
| 125 | 141 | ! write the file which is used to generate to FastHenry2 input file |
| 126 | 142 | OPEN(unit=fh2_input_file_unit,file='fh2.txt') |
| ... | ... | @@ -136,21 +152,42 @@ integer :: ierr |
| 136 | 152 | |
| 137 | 153 | write(fh2_input_file_unit,'(A)')'ground_plane' |
| 138 | 154 | |
| 139 | -! ********* HARD WIRED GROUND PLANE SPEC: TO BE SORTED OUT ************ | |
| 140 | - write(fh2_input_file_unit,'(A)')'-25e-3 0.0e-3 0.0e-3 ! x y z of ground plane point 1 ' | |
| 141 | - write(fh2_input_file_unit,'(A)')' 25e-3 0.0e-3 0.0e-3 ! x y z of ground plane point 2 ' | |
| 142 | - write(fh2_input_file_unit,'(A)')' 25e-3 0.0e-3 1000.0e-3 ! x y z of ground plane point 3 ' | |
| 143 | - write(fh2_input_file_unit,'(A)')'0.01e-3 ! thickness ' | |
| 144 | - write(fh2_input_file_unit,'(A)')'10 10 ! discretisation in p1-p2 and p2=p3 directions' | |
| 145 | - write(fh2_input_file_unit,'(A)')'4.461E+07 ! conductivity, sigma ' | |
| 146 | - write(fh2_input_file_unit,'(A)')'1 ! gp discretisation in thickness, nhinc ' | |
| 155 | +! ********* STILL SOME HARD WIRED GROUND PLANE SPEC: TO BE SORTED OUT ************ | |
| 156 | + | |
| 157 | +! ALSO NEED TO CHECK THAT EVERYTHING WE NEED IS SET... | |
| 158 | + | |
| 159 | + write(*,*)'Ground plane parameters:' | |
| 160 | + write(*,*)'PUL%ground_plane_w=',PUL%ground_plane_w | |
| 161 | + write(*,*)'PUL%ground_plane_h=',PUL%ground_plane_h | |
| 162 | + write(*,*)'PUL%ground_plane_sigma=',PUL%ground_plane_sigma | |
| 163 | + write(*,*)'PUL%ground_plane_nsegx=',PUL%ground_plane_nsegx | |
| 164 | + write(*,*)'PUL%ground_plane_nsegz=',PUL%ground_plane_nsegz | |
| 165 | + write(*,*)'PUL%ground_plane_nh=',PUL%ground_plane_nh | |
| 166 | + | |
| 167 | + if ( (PUL%ground_plane_w.EQ.0d0).OR.(PUL%ground_plane_h.EQ.0d0).OR.(PUL%ground_plane_sigma.EQ.0d0) & | |
| 168 | + .OR.(PUL%ground_plane_nsegx.EQ.0).OR.(PUL%ground_plane_nsegz.EQ.0).OR.(PUL%ground_plane_nh.EQ.0) )then | |
| 169 | + write(run_status,*)'ERROR in PUL_RL_FastHenry2: ground plane parameters not defined' | |
| 170 | + CALL write_program_status() | |
| 171 | + STOP 1 | |
| 172 | + end if | |
| 173 | + | |
| 174 | + gp_half_width=PUL%ground_plane_w/2.0 | |
| 175 | + | |
| 176 | + write(fh2_input_file_unit,'(ES12.4,A)')-gp_half_width,' 0.0e-3 0.0e-3 ! x y z of ground plane point 1' | |
| 177 | + write(fh2_input_file_unit,'(ES12.4,A)') gp_half_width,' 0.0e-3 0.0e-3 ! x y z of ground plane point 2' | |
| 178 | + write(fh2_input_file_unit,'(ES12.4,A)') gp_half_width,' 0.0e-3 1000.0e-3 ! x y z of ground plane point 3' | |
| 179 | + write(fh2_input_file_unit,'(ES12.4,A)')PUL%ground_plane_h,' ! thickness ' | |
| 180 | + write(fh2_input_file_unit,'(2I6,A)')PUL%ground_plane_nsegx,PUL%ground_plane_nsegz, & | |
| 181 | + ' ! discretisation in p1-p2 and p2=p3 directions' | |
| 182 | + write(fh2_input_file_unit,'(ES12.4,A)')PUL%ground_plane_sigma,' ! conductivity, sigma ' | |
| 183 | + write(fh2_input_file_unit,'(I4,A)')PUL%ground_plane_nh,' ! gp discretisation in thickness, nhinc ' | |
| 147 | 184 | write(fh2_input_file_unit,'(A)')'2.0 ! gp discretisation in thickness ratio, rh ' |
| 148 | 185 | write(fh2_input_file_unit,'(A)')'0e-3 0.0e-3 0.0e-3 ! x y z of ground plane node at end 1 ' |
| 149 | 186 | write(fh2_input_file_unit,'(A)')'0e-3 0.0e-3 1000.0e-3 ! x y z of ground plane node at end 2 ' |
| 150 | -! ********* HARD WIRED GROUND PLANE SPEC: TO BE SORTED OUT ************ | |
| 187 | +! ********* STILL SOME HARD WIRED GROUND PLANE SPEC: TO BE SORTED OUT ************ | |
| 151 | 188 | |
| 152 | 189 | else if ((.NOT.PUL%overshield_present).AND.(.NOT.PUL%ground_plane_present)) then |
| 153 | - | |
| 190 | + | |
| 154 | 191 | first_conductor=1 |
| 155 | 192 | last_conductor=PUL%n_conductors |
| 156 | 193 | |
| ... | ... | @@ -174,10 +211,10 @@ integer :: ierr |
| 174 | 211 | write(fh2_input_file_unit,'(A)')'cylindrical ! conductor 1 shape (cylinder, rectangle, annulus)' |
| 175 | 212 | write(fh2_input_file_unit,'(2ES12.4,A)')PUL%x(conductor),PUL%y(conductor),' ! centre xc yc' |
| 176 | 213 | write(fh2_input_file_unit,'(ES12.4,A)')PUL%r(conductor),' ! radius rc' |
| 177 | - write(fh2_input_file_unit,'(ES12.4,A)')PUL%r(conductor)/8,' ! cylindrical conductor discretisation size, dl' | |
| 178 | - write(fh2_input_file_unit,'(A)')'4.461E+07 ! conductivity, sigma ' | |
| 179 | - write(fh2_input_file_unit,'(A)')'3 3 ! segment discretisation in x and y, nwinc nhinc ' | |
| 180 | - write(fh2_input_file_unit,'(A)')'2.0 2.0 ! segment discretisation ratio in x and y, rw rh ' | |
| 214 | + write(fh2_input_file_unit,'(ES12.4,A)')PUL%r(conductor)/FH2_nlayers_radius,' ! cylindrical conductor discretisation size, dl' | |
| 215 | + write(fh2_input_file_unit,'(ES12.4,A)')PUL%sigma(conductor),' ! conductivity, sigma ' | |
| 216 | + write(fh2_input_file_unit,'(2I4,A)')FH2_nw,FH2_nh,' ! segment discretisation in x and y, nwinc nhinc ' | |
| 217 | + write(fh2_input_file_unit,'(2ES12.4,A)')FH2_rw,FH2_rh,' ! segment discretisation ratio in x and y, rw rh ' | |
| 181 | 218 | |
| 182 | 219 | else if (PUL%shape(conductor).EQ.rectangle) then |
| 183 | 220 | |
| ... | ... | @@ -195,12 +232,12 @@ integer :: ierr |
| 195 | 232 | |
| 196 | 233 | write(fh2_input_file_unit,'(ES12.4,A)')freq_spec%fmin,' ! Minimum frequency, fmin' |
| 197 | 234 | write(fh2_input_file_unit,'(ES12.4,A)')freq_spec%fmax,' ! Maximum frequency, fmax' |
| 198 | - write(fh2_input_file_unit,'(I8,A)')ndec,' ! Number of points per decade, ndec' | |
| 235 | + write(fh2_input_file_unit,'(ES12.4,A)')freq_spec%ndec,' ! Number of points per decade, ndec' | |
| 199 | 236 | |
| 200 | 237 | CLOSE(unit=fh2_input_file_unit) |
| 201 | 238 | |
| 202 | 239 | write(*,*)'CALLING FastHenry2' |
| 203 | - command='/home/chris/SACAMOS_FASTHENRY2/FASTHENRY2_WRITE_INPUT_FILE/bin/write_FH_input_file < fh2.txt' | |
| 240 | + command='write_FH_input_file < fh2.txt' | |
| 204 | 241 | CALL execute_command_line(command,EXITSTAT=exit_stat) |
| 205 | 242 | |
| 206 | 243 | ! Check that the FastHenry2 input file generated correctly |
| ... | ... | @@ -306,6 +343,7 @@ integer :: ierr |
| 306 | 343 | if (verbose) write(*,*)'Number of frequencies=',n_freq_in |
| 307 | 344 | ALLOCATE( freq_in(n_freq_in) ) |
| 308 | 345 | ALLOCATE( Zc_in(n_freq_in,nrows,ncols) ) |
| 346 | + ALLOCATE( Rdc_domain(nrows,ncols) ) | |
| 309 | 347 | ALLOCATE( values(2*ncols) ) |
| 310 | 348 | rewind(unit=fh2_output_file_unit) |
| 311 | 349 | end if |
| ... | ... | @@ -313,24 +351,102 @@ integer :: ierr |
| 313 | 351 | end do ! next file read loop |
| 314 | 352 | |
| 315 | 353 | CLOSE(unit=fh2_output_file_unit) |
| 354 | + | |
| 355 | + matrix_dimension=PUL%n_conductors-1 | |
| 356 | + | |
| 357 | + if (matrix_dimension.NE.nrows) then | |
| 358 | + write(run_status,*)'ERROR in PUL_RL_FastHenry2 matrix dimension',matrix_dimension,nrows | |
| 359 | + CALL write_program_status() | |
| 360 | + STOP 1 | |
| 361 | + end if | |
| 316 | 362 | |
| 317 | -! For now use the inductance from the highest frequency calculated | |
| 363 | +! For the modal decomposition, use the inductance from the highest frequency calculated | |
| 318 | 364 | do r=1,nrows |
| 319 | 365 | do c=1,ncols |
| 320 | 366 | |
| 321 | 367 | freq=freq_in(n_freq_in) |
| 322 | 368 | w=2.0*pi*freq |
| 323 | 369 | |
| 324 | - PUL%L%mat(r,c)=real(Zc_in(n_freq_in,r,c)/(j*w)) | |
| 325 | - PUL%Zfilter%sfilter_mat(r,c)=jwA_filter( PUL%L%mat(r,c) ) | |
| 370 | + PUL%L%mat(r,c)=real(Zc_in(n_freq_in,r,c)/(j*w)) | |
| 326 | 371 | |
| 327 | - write(*,*)r,c,PUL%L%mat(r,c) | |
| 372 | + end do | |
| 373 | + end do | |
| 374 | + | |
| 375 | +! Save the resistance matrix from the lowest frequency calculated | |
| 376 | + do r=1,nrows | |
| 377 | + do c=1,ncols | |
| 378 | + | |
| 379 | + Rdc_domain(r,c)=real(Zc_in(1,r,c)) | |
| 328 | 380 | |
| 329 | 381 | end do |
| 330 | 382 | end do |
| 383 | + | |
| 384 | +! We calculate the inductance and resistance matrix at a number of frequencies before fitting filter functions | |
| 385 | +! to each of the frequency dependent impedance matrix entries. | |
| 386 | + | |
| 387 | + write(*,*)'**************************' | |
| 388 | + write(*,*)'Process FastHenry2 results' | |
| 389 | + write(*,*)'**************************' | |
| 390 | + write(*,*)'Number of frequencies (freq_spec) =',freq_spec%n_frequencies | |
| 391 | + write(*,*)'Number of frequencies (FastHenry2)=',n_freq_in | |
| 392 | + | |
| 393 | +! Frequency check | |
| 394 | + if (n_freq_in.NE.freq_spec%n_frequencies) then | |
| 395 | + write(run_status,*)'ERROR in PUL_RL_FastHenry2 n_frequencies specification',n_freq_in,freq_spec%n_frequencies | |
| 396 | + CALL write_program_status() | |
| 397 | + STOP 1 | |
| 398 | + end if | |
| 399 | + | |
| 400 | + do floop=1,n_freq_in | |
| 401 | + ferr=abs(freq_spec%freq_list(floop)-freq_in(floop))/(freq_spec%freq_list(floop)+freq_in(floop)) | |
| 402 | + if (ferr.GT.0.001) then | |
| 403 | + write(run_status,*)'ERROR in PUL_RL_FastHenry2 frequency samples, floop=',floop, & | |
| 404 | + ' freq_spec=',freq_spec%freq_list(floop),' freq_FH2=',freq_in(floop) | |
| 405 | + CALL write_program_status() | |
| 406 | + STOP 1 | |
| 407 | + end if | |
| 408 | + end do | |
| 409 | + | |
| 410 | +! loop over frequency | |
| 411 | + if (verbose) then | |
| 412 | + do floop=1,n_freq_in | |
| 413 | + write(*,*)freq_spec%freq_list(floop),freq_in(floop) | |
| 414 | + end do | |
| 415 | + end if | |
| 416 | + | |
| 417 | +! we have frequency domain impedance matrix, Zc | |
| 418 | + | |
| 419 | +! loop over the elements of Zc and the Zfilter matrix by filter fitting | |
| 420 | + ALLOCATE( function_to_fit(1:freq_spec%n_frequencies) ) | |
| 421 | + | |
| 422 | + do row=1,matrix_dimension | |
| 423 | + do col=row,matrix_dimension | |
| 424 | + | |
| 425 | +! get the function values for this matrix element function_to_fit=R-Rdc+jwL | |
| 426 | + do floop=1,freq_spec%n_frequencies | |
| 427 | + function_to_fit(floop)=Zc_in(floop,row,col)-Rdc_domain(row,col) | |
| 428 | + end do | |
| 429 | + | |
| 430 | +! calculate the Zfilter matrix using the filter fitting process | |
| 431 | +! note aorder=border and no restrictions are put on the function | |
| 432 | + | |
| 433 | + CALL Calculate_Sfilter(function_to_fit,freq_spec%freq_list,freq_spec%n_frequencies, & | |
| 434 | + PUL%Zfilter%sfilter_mat(row,col),fit_order+1,-1,2) ! note type 2 filter fit=> a0=0.0 | |
| 435 | + | |
| 436 | + if (col.NE.row) then | |
| 437 | +! make the matrix symmetrical | |
| 438 | + PUL%Zfilter%sfilter_mat(col,row)=PUL%Zfilter%sfilter_mat(row,col) | |
| 439 | + end if | |
| 440 | + | |
| 441 | + end do ! next col | |
| 442 | + | |
| 443 | + end do ! next row | |
| 444 | + | |
| 445 | + DEALLOCATE( function_to_fit ) | |
| 331 | 446 | |
| 332 | 447 | DEALLOCATE( freq_in ) |
| 333 | 448 | DEALLOCATE( Zc_in ) |
| 449 | + DEALLOCATE( Rdc_domain ) | |
| 334 | 450 | DEALLOCATE( values ) |
| 335 | 451 | |
| 336 | 452 | if (verbose) then | ... | ... |
SRC/PUL_PARAMETER_CALCULATION/PUL_parameter_module.F90
| ... | ... | @@ -85,6 +85,7 @@ TYPE::PUL_type |
| 85 | 85 | |
| 86 | 86 | ! conductor based arrays: |
| 87 | 87 | integer,allocatable :: shape(:) ! holds a nuber which indicates the shape of the conductor |
| 88 | + real(dp),allocatable :: sigma(:) ! electrical conductivity of a conductor | |
| 88 | 89 | real(dp),allocatable :: r(:) ! radius of a circular conductor |
| 89 | 90 | real(dp),allocatable :: x(:) ! x coordinate of the centre of the cable to which this conductor belongs |
| 90 | 91 | real(dp),allocatable :: y(:) ! y coordinate of the centre of the cable to which this conductor belongs |
| ... | ... | @@ -104,7 +105,14 @@ TYPE::PUL_type |
| 104 | 105 | logical :: ground_plane_present ! flag to indicate the presence of a ground plane |
| 105 | 106 | real(dp) :: ground_plane_angle ! angle of ground plane normal from the x axis |
| 106 | 107 | real(dp) :: ground_plane_offset ! ground plane offset |
| 107 | - | |
| 108 | + real(dp) :: ground_plane_sigma ! ground plane conductivity | |
| 109 | + real(dp) :: ground_plane_w ! ground plane width | |
| 110 | + real(dp) :: ground_plane_h ! ground plane height | |
| 111 | + real(dp) :: ground_plane_Rdc ! ground plane dc resistance | |
| 112 | + integer :: ground_plane_nsegx ! ground plane number of segments in x | |
| 113 | + integer :: ground_plane_nsegz ! ground plane number of segments in z | |
| 114 | + integer :: ground_plane_nh ! ground plane number of layers in h | |
| 115 | + | |
| 108 | 116 | logical :: overshield_present ! flag to indicate the presence of an overshield |
| 109 | 117 | integer :: overshield_shape ! holds a nuber which indicates the shape of the opvershield |
| 110 | 118 | real(dp) :: overshield_x ! x coordinate of the centre of the overshield |
| ... | ... | @@ -184,6 +192,7 @@ include "CG_solve.F90" |
| 184 | 192 | ! allocate memory for PUL structure |
| 185 | 193 | PUL%n_conductors=n_conductors |
| 186 | 194 | ALLOCATE( PUL%shape( PUL%n_conductors) ) |
| 195 | + ALLOCATE( PUL%sigma( PUL%n_conductors) ) | |
| 187 | 196 | ALLOCATE( PUL%x( PUL%n_conductors) ) |
| 188 | 197 | ALLOCATE( PUL%y( PUL%n_conductors) ) |
| 189 | 198 | ALLOCATE( PUL%r( PUL%n_conductors) ) |
| ... | ... | @@ -204,6 +213,7 @@ include "CG_solve.F90" |
| 204 | 213 | do i=1,PUL%n_conductors |
| 205 | 214 | |
| 206 | 215 | PUL%shape(i)=0 |
| 216 | + PUL%sigma(i)=0d0 | |
| 207 | 217 | PUL%x(i)=0d0 |
| 208 | 218 | PUL%y(i)=0d0 |
| 209 | 219 | PUL%r(i)=0d0 |
| ... | ... | @@ -225,7 +235,14 @@ include "CG_solve.F90" |
| 225 | 235 | PUL%ground_plane_present=.FALSE. |
| 226 | 236 | PUL%ground_plane_angle=0d0 |
| 227 | 237 | PUL%ground_plane_offset=0d0 |
| 228 | - | |
| 238 | + PUL%ground_plane_sigma=0d0 | |
| 239 | + PUL%ground_plane_w=0d0 | |
| 240 | + PUL%ground_plane_h=0d0 | |
| 241 | + PUL%ground_plane_Rdc=0d0 | |
| 242 | + PUL%ground_plane_nsegx=0 | |
| 243 | + PUL%ground_plane_nsegz=0 | |
| 244 | + PUL%ground_plane_nh=1 | |
| 245 | + | |
| 229 | 246 | PUL%overshield_present=.FALSE. |
| 230 | 247 | PUL%overshield_shape=circle ! circle by default |
| 231 | 248 | PUL%overshield_x=0d0 |
| ... | ... | @@ -272,6 +289,7 @@ include "CG_solve.F90" |
| 272 | 289 | ! START |
| 273 | 290 | |
| 274 | 291 | if (allocated(PUL%shape ) ) DEALLOCATE( PUL%shape ) |
| 292 | + if (allocated(PUL%sigma ) ) DEALLOCATE( PUL%sigma ) | |
| 275 | 293 | if (allocated(PUL%x ) ) DEALLOCATE( PUL%x ) |
| 276 | 294 | if (allocated(PUL%y ) ) DEALLOCATE( PUL%y ) |
| 277 | 295 | if (allocated(PUL%r ) ) DEALLOCATE( PUL%r ) | ... | ... |
SRC/SFILTER_FIT/Calculate_Sfilter.F90
| ... | ... | @@ -39,9 +39,11 @@ |
| 39 | 39 | ! If the model order is negative on input then the 'optimium' model is returned |
| 40 | 40 | ! between model order 0 and abs(model_order) |
| 41 | 41 | ! |
| 42 | -! Two types of model are considered - s general model in which no constraints are placed on the filter function | |
| 43 | -! and a model for the propagation correction in which the constraint that the value of the filter function at | |
| 42 | +! Three types of model are considered - | |
| 43 | +! 1: a general model in which no constraints are placed on the filter function | |
| 44 | +! 2: a model for the propagation correction in which the constraint that the value of the filter function at | |
| 44 | 45 | ! zero frequency is equal to 1.0 |
| 46 | +! 3: a model for the Z-Rdc matrices where the value of the filter function at zero frequency is equal to 0.0 | |
| 45 | 47 | ! |
| 46 | 48 | ! COMMENTS |
| 47 | 49 | ! The stopping criterion for calculation of the optimum model is an inflection in the function log_error(model_order) |
| ... | ... | @@ -53,6 +55,7 @@ |
| 53 | 55 | ! return the order model specified. |
| 54 | 56 | ! 14/10/2017 CJS include a check for unstable filters and add an absolute convergence check |
| 55 | 57 | ! 16/11/2017 CJS Include network synthesis process to replace s-domain transfer functions |
| 58 | +! 25/10/2023 CJS Add a mode fit type where a0=0.0 for fitting to Z-Rdc matrices | |
| 56 | 59 | ! |
| 57 | 60 | ! |
| 58 | 61 | SUBROUTINE Calculate_Sfilter(Hp,f,n_frequencies,Hfilter,model_order,relative_border,fit_type) |
| ... | ... | @@ -75,6 +78,7 @@ integer,intent(IN) :: model_order ! Numerator model |
| 75 | 78 | integer,intent(IN) :: relative_border ! Denominator model order to calculate relative to numerator order, border=aorder+relative_border |
| 76 | 79 | integer,intent(IN) :: fit_type ! Type of model fit. fit_type=0 has no restrictions on f=0 value |
| 77 | 80 | ! fit_type=1 imposes Hfilter(f=0)=1.0 |
| 81 | + ! fit_type=2 imposes Hfilter(f=0)=0.0 | |
| 78 | 82 | ! local variables |
| 79 | 83 | |
| 80 | 84 | integer :: order | ... | ... |
SRC/SFILTER_FIT/Weiner_Hopf.F90
| ... | ... | @@ -38,9 +38,11 @@ |
| 38 | 38 | ! as described in Dawson paper [**** REFERENCE REQUIRED ****] |
| 39 | 39 | ! |
| 40 | 40 | ! COMMENTS |
| 41 | +! If fit_type=0 then we fit directly to the given function values. | |
| 41 | 42 | ! If fit_type=1 then we impose Hfilter(f=0)=1.0. In this case we fit to a finction Hp-1 to |
| 42 | 43 | ! calculate a filter function with a(0)=0, then add 1 to this filter to give the result. |
| 43 | -! If fit_type=0 then we fit directly to the given function values. | |
| 44 | +! If fit_type=2 then we impose Hfilter(f=0)=0.0. In this case we fit to a finction Hp to | |
| 45 | +! calculate a filter function with a(0)=0. | |
| 44 | 46 | ! |
| 45 | 47 | ! HISTORY |
| 46 | 48 | ! |
| ... | ... | @@ -121,6 +123,12 @@ integer,intent(IN) :: fit_type ! Type of model fi |
| 121 | 123 | Hfilter%a%coeff(0)=1d0 |
| 122 | 124 | |
| 123 | 125 | RETURN |
| 126 | + | |
| 127 | + else if (fit_type.EQ.2) then ! this type has the requirement that Hfilter(f=0)=1.0 so return Hfilter=1 | |
| 128 | + | |
| 129 | + Hfilter%a%coeff(0)=0d0 | |
| 130 | + | |
| 131 | + RETURN | |
| 124 | 132 | |
| 125 | 133 | else |
| 126 | 134 | ! Hfilter is effectively a real constant and can be calculated as the average of the real part of the input function values |
| ... | ... | @@ -146,10 +154,17 @@ integer,intent(IN) :: fit_type ! Type of model fi |
| 146 | 154 | coeff_dim=aorder+1+border |
| 147 | 155 | first_a=0 |
| 148 | 156 | N_a=aorder+1 |
| 149 | - else ! Hfilter(f=0)=1.0 thus a(0)=1.0 and b(0)=1.0 | |
| 157 | + else if (fit_type.EQ.1) then ! Hfilter(f=0)=1.0 thus a(0)=1.0 and b(0)=1.0 | |
| 150 | 158 | coeff_dim=aorder+border |
| 151 | 159 | first_a=1 |
| 152 | 160 | N_a=aorder |
| 161 | + else if (fit_type.EQ.2) then ! Hfilter(f=0)=0.0 thus a(0)=0.0 and b(0)=1.0 | |
| 162 | + coeff_dim=aorder+border | |
| 163 | + first_a=1 | |
| 164 | + N_a=aorder | |
| 165 | + else | |
| 166 | + write(*,*)'ERROR in Weiner_Hopf: fit_type should be 0, 1 or 2, here fit_type=',fit_type | |
| 167 | + STOP 1 | |
| 153 | 168 | end if |
| 154 | 169 | |
| 155 | 170 | ! Allocate memory for the matrices and vectors used in the calculations |
| ... | ... | @@ -255,6 +270,12 @@ integer,intent(IN) :: fit_type ! Type of model fi |
| 255 | 270 | row=i |
| 256 | 271 | Hfilter%a%coeff(i)=VC(row)+Hfilter%b%coeff(i) |
| 257 | 272 | end do |
| 273 | + else if (fit_type.eq.2) then ! we have a fit to Hp(f) so calculate the coefficients of H=A(jomega)/B(jomega) | |
| 274 | + Hfilter%a%coeff(0)=0d0 | |
| 275 | + do i=1,aorder | |
| 276 | + row=i | |
| 277 | + Hfilter%a%coeff(i)=VC(row) | |
| 278 | + end do | |
| 258 | 279 | else |
| 259 | 280 | do i=0,aorder |
| 260 | 281 | row=i+1 | ... | ... |
| ... | ... | @@ -0,0 +1,22 @@ |
| 1 | + if (conductor_data(conductor)%auto_grid_density) then | |
| 2 | + required_dl=conductor_data(conductor)%skin_depth ! could add reduction factor here e.g. /2.0 | |
| 3 | + conductor_data(conductor)%dl=required_dl | |
| 4 | + end if | |
| 5 | + | |
| 6 | + conductor_data(conductor)%nxmax=NINT(conductor_data(conductor)%grid_dim/conductor_data(conductor)%dl)+1 | |
| 7 | + conductor_data(conductor)%nxmin=-conductor_data(conductor)%nxmax | |
| 8 | + | |
| 9 | + conductor_data(conductor)%nymax=conductor_data(conductor)%nxmax | |
| 10 | + conductor_data(conductor)%nymin=conductor_data(conductor)%nxmin | |
| 11 | + | |
| 12 | + nxmin=conductor_data(conductor)%nxmin | |
| 13 | + nxmax=conductor_data(conductor)%nxmax | |
| 14 | + nymin=conductor_data(conductor)%nymin | |
| 15 | + nymax=conductor_data(conductor)%nymax | |
| 16 | + | |
| 17 | + ALLOCATE( conductor_data(conductor)%grid(nxmin:nxmax,nymin:nymax) ) | |
| 18 | + ALLOCATE( conductor_data(conductor)%depth(nxmin:nxmax,nymin:nymax) ) | |
| 19 | + | |
| 20 | +! Reset the grid | |
| 21 | + conductor_data(conductor)%grid(nxmin:nxmax,nymin:nymax)=0 | |
| 22 | + conductor_data(conductor)%depth(nxmin:nxmax,nymin:nymax)=0.0 | ... | ... |
| ... | ... | @@ -0,0 +1,16 @@ |
| 1 | + conductor_data(conductor)%mesh_type=mesh_type_layer ! default | |
| 2 | + conductor_data(conductor)%mesh_to_layer_type=1 | |
| 3 | + | |
| 4 | + if ( INDEX(line_string,'auto').NE.0) conductor_data(conductor)%auto_grid_density=.TRUE. | |
| 5 | + | |
| 6 | + if ( INDEX(line_string,'grid_layer').NE.0) then | |
| 7 | + | |
| 8 | + conductor_data(conductor)%mesh_type=mesh_type_grid | |
| 9 | + conductor_data(conductor)%mesh_to_layer_type=2 | |
| 10 | + | |
| 11 | + else if ( INDEX(line_string,'grid').NE.0) then | |
| 12 | + | |
| 13 | + conductor_data(conductor)%mesh_type=mesh_type_grid | |
| 14 | + conductor_data(conductor)%mesh_to_layer_type=1 | |
| 15 | + | |
| 16 | + end if | ... | ... |
| ... | ... | @@ -0,0 +1,90 @@ |
| 1 | + | |
| 2 | + nxmin=conductor_data(conductor)%nxmin | |
| 3 | + nxmax=conductor_data(conductor)%nxmax | |
| 4 | + nymin=conductor_data(conductor)%nymin | |
| 5 | + nymax=conductor_data(conductor)%nymax | |
| 6 | + | |
| 7 | + layer_number=0 | |
| 8 | + | |
| 9 | + if (conductor_data(conductor)%mesh_to_layer_type.EQ.1) then | |
| 10 | +! each marked cell in the grid becomes a layer and hence a segment | |
| 11 | + | |
| 12 | + do ix=nxmin,nxmax | |
| 13 | + do iy=nymin,nymax | |
| 14 | + if ( conductor_data(conductor)%grid(ix,iy).EQ.1 ) then | |
| 15 | + | |
| 16 | + layer_number=layer_number+1 | |
| 17 | + | |
| 18 | + apx=conductor_data(conductor)%xc+real(ix)*conductor_data(conductor)%dl | |
| 19 | + apy=conductor_data(conductor)%yc+real(iy)*conductor_data(conductor)%dl | |
| 20 | + | |
| 21 | + conductor_data(conductor)%x(layer_number)=apx | |
| 22 | + conductor_data(conductor)%y(layer_number)=apy | |
| 23 | + conductor_data(conductor)%w(layer_number)=conductor_data(conductor)%dl | |
| 24 | + conductor_data(conductor)%h(layer_number)=conductor_data(conductor)%dl | |
| 25 | + | |
| 26 | + conductor_data(conductor)%d(layer_number)=0.0 | |
| 27 | + conductor_data(conductor)%anwinc(layer_number)=conductor_data(conductor)%nwinc | |
| 28 | + conductor_data(conductor)%anhinc(layer_number)=conductor_data(conductor)%nwinc | |
| 29 | + | |
| 30 | + end if | |
| 31 | + end do | |
| 32 | + end do | |
| 33 | + | |
| 34 | + else if (conductor_data(conductor)%mesh_to_layer_type.EQ.2) then | |
| 35 | + | |
| 36 | +! each row of cells in the grid becomes a segment | |
| 37 | + do iy=nymin,nymax | |
| 38 | + | |
| 39 | + in_conductor=.FALSE. | |
| 40 | + cx1=0 | |
| 41 | + cx2=0 | |
| 42 | + | |
| 43 | + do ix=nxmin,nxmax | |
| 44 | + | |
| 45 | + if ( (.NOT.in_conductor).AND.(conductor_data(conductor)%grid(ix,iy).EQ.1) ) then | |
| 46 | + | |
| 47 | +! we have moved from air to conductor so save this x cell number | |
| 48 | + cx1=ix | |
| 49 | + in_conductor=.TRUE. | |
| 50 | + | |
| 51 | + else if ( (in_conductor).AND.(conductor_data(conductor)%grid(ix,iy).EQ.0) ) then | |
| 52 | +! we have moved from air to conductor so save this x cell number | |
| 53 | + | |
| 54 | + cx2=ix-1 | |
| 55 | + in_conductor=.FALSE. | |
| 56 | + | |
| 57 | + layer_number=layer_number+1 | |
| 58 | + | |
| 59 | + cw=real(cx2-cx1+1)*conductor_data(conductor)%dl | |
| 60 | + ch=conductor_data(conductor)%dl | |
| 61 | + | |
| 62 | + apx=conductor_data(conductor)%xc+real(cx2+cx1)/2.0 | |
| 63 | + apy=conductor_data(conductor)%yc+real(iy)*conductor_data(conductor)%dl | |
| 64 | + | |
| 65 | + conductor_data(conductor)%x(layer_number)=apx | |
| 66 | + conductor_data(conductor)%y(layer_number)=apy | |
| 67 | + conductor_data(conductor)%w(layer_number)=cw | |
| 68 | + conductor_data(conductor)%h(layer_number)=ch | |
| 69 | + | |
| 70 | + conductor_data(conductor)%d(layer_number)=0.0 | |
| 71 | + conductor_data(conductor)%anwinc(layer_number)=conductor_data(conductor)%nwinc | |
| 72 | + conductor_data(conductor)%anhinc(layer_number)=conductor_data(conductor)%nwinc | |
| 73 | + | |
| 74 | + cx1=0 | |
| 75 | + cx2=0 | |
| 76 | + | |
| 77 | + end if | |
| 78 | + | |
| 79 | + end do ! next col | |
| 80 | + | |
| 81 | + end do ! next row | |
| 82 | + | |
| 83 | + else | |
| 84 | + write(*,*)'Unknown mesh_to_layer_type:',conductor_data(conductor)%mesh_to_layer_type, & | |
| 85 | + 'in conductor',conductor | |
| 86 | + STOP 1 | |
| 87 | + end if | |
| 88 | + | |
| 89 | +! the number of layers may have changed if we have combined grid cells | |
| 90 | + conductor_data(conductor)%tot_n_layers=layer_number | ... | ... |
SRC/cable_bundle_model_builder.F90
| ... | ... | @@ -111,6 +111,7 @@ type(bundle_specification_type) ::bundle_spec |
| 111 | 111 | logical :: file_exists |
| 112 | 112 | |
| 113 | 113 | character(len=line_length) :: line |
| 114 | +character(len=line_length) :: stripped_line | |
| 114 | 115 | |
| 115 | 116 | integer :: ierr,ierr2 ! integers to return error codes from file reads |
| 116 | 117 | |
| ... | ... | @@ -246,7 +247,8 @@ logical :: must_use_laplace |
| 246 | 247 | |
| 247 | 248 | bundle_spec%n_cables_without_ground_plane=bundle_spec%n_cables |
| 248 | 249 | |
| 249 | - if (line.eq.'ground_plane') then | |
| 250 | +! if (line.eq.'ground_plane') then | |
| 251 | + if (index(line,'ground_plane').EQ.1) then | |
| 250 | 252 | |
| 251 | 253 | bundle_spec%ground_plane_present=.TRUE. |
| 252 | 254 | |
| ... | ... | @@ -272,13 +274,49 @@ logical :: must_use_laplace |
| 272 | 274 | bundle_spec%cable_x_offset(cable)=bundle_spec%ground_plane_x |
| 273 | 275 | bundle_spec%cable_y_offset(cable)=bundle_spec%ground_plane_y |
| 274 | 276 | bundle_spec%cable_angle(cable)=bundle_spec%ground_plane_theta |
| 277 | + | |
| 278 | +! Attempt to read additional parameters for FastHenry2 calculation, sigma, width, thickness | |
| 279 | + stripped_line=line(13:line_length) | |
| 280 | + read(stripped_line,*,ERR=100,END=100)bundle_spec%ground_plane_sigma & | |
| 281 | + ,bundle_spec%ground_plane_w & | |
| 282 | + ,bundle_spec%ground_plane_h & | |
| 283 | + ,bundle_spec%ground_plane_nsegx & | |
| 284 | + ,bundle_spec%ground_plane_nsegz & | |
| 285 | + ,bundle_spec%ground_plane_nh | |
| 286 | + | |
| 287 | + bundle_spec%ground_plane_Rdc=1d0/(bundle_spec%ground_plane_sigma*bundle_spec%ground_plane_w*bundle_spec%ground_plane_h) | |
| 275 | 288 | |
| 276 | 289 | ! create conductor impedance model for the new cable |
| 277 | 290 | ALLOCATE(bundle_spec%cable(cable)%conductor_impedance(1:1)) |
| 291 | + bundle_spec%cable(cable)%conductor_impedance(1)%impedance_model_type=impedance_model_type_FH2 | |
| 292 | + bundle_spec%cable(cable)%conductor_impedance(1)%Resistance_multiplication_factor=1d0 | |
| 293 | + bundle_spec%cable(cable)%conductor_impedance(1)%radius=0d0 | |
| 294 | + bundle_spec%cable(cable)%conductor_impedance(1)%conductivity=bundle_spec%ground_plane_sigma | |
| 295 | + bundle_spec%cable(cable)%conductor_impedance(1)%width=bundle_spec%ground_plane_w | |
| 296 | + bundle_spec%cable(cable)%conductor_impedance(1)%height=bundle_spec%ground_plane_h | |
| 297 | + bundle_spec%cable(cable)%conductor_impedance(1)%Rdc=bundle_spec%ground_plane_Rdc | |
| 298 | + | |
| 299 | + GOTO 200 | |
| 300 | + | |
| 301 | +100 CONTINUE ! jump here if we have failed to read FastHenry2 parameters | |
| 302 | +! create conductor impedance model for the new cable | |
| 303 | + ALLOCATE(bundle_spec%cable(cable)%conductor_impedance(1:1)) | |
| 278 | 304 | bundle_spec%cable(cable)%conductor_impedance(1)%impedance_model_type=impedance_model_type_PEC |
| 279 | 305 | bundle_spec%cable(cable)%conductor_impedance(1)%Resistance_multiplication_factor=1d0 |
| 280 | 306 | bundle_spec%cable(cable)%conductor_impedance(1)%radius=0d0 |
| 281 | 307 | bundle_spec%cable(cable)%conductor_impedance(1)%conductivity=0d0 |
| 308 | + bundle_spec%cable(cable)%conductor_impedance(1)%width=0d0 | |
| 309 | + bundle_spec%cable(cable)%conductor_impedance(1)%height=0d0 | |
| 310 | + bundle_spec%cable(cable)%conductor_impedance(1)%Rdc=0d0 | |
| 311 | + bundle_spec%ground_plane_sigma=0d0 | |
| 312 | + bundle_spec%ground_plane_w=0d0 | |
| 313 | + bundle_spec%ground_plane_h=0d0 | |
| 314 | + bundle_spec%ground_plane_Rdc=0d0 | |
| 315 | + bundle_spec%ground_plane_nsegx=0 | |
| 316 | + bundle_spec%ground_plane_nsegz=0 | |
| 317 | + bundle_spec%ground_plane_nh=0 | |
| 318 | + | |
| 319 | +200 CONTINUE ! jump here if we do have FastHenry2 parameters | |
| 282 | 320 | |
| 283 | 321 | else if (line.eq.'no_ground_plane') then |
| 284 | 322 | |
| ... | ... | @@ -311,14 +349,14 @@ logical :: must_use_laplace |
| 311 | 349 | if (ierr.NE.0) then |
| 312 | 350 | ! Assume there is no filter fit information specified so move on to the next stage |
| 313 | 351 | backspace(bundle_spec_file_unit) |
| 314 | - goto 100 | |
| 352 | + goto 300 | |
| 315 | 353 | end if |
| 316 | 354 | |
| 317 | 355 | write(*,*)'Reading the filter fit frequency range' |
| 318 | 356 | |
| 319 | 357 | CALL read_and_set_up_frequency_specification(bundle_spec%Y_fit_freq_spec,bundle_spec_file_unit) |
| 320 | 358 | |
| 321 | -100 continue | |
| 359 | +300 continue | |
| 322 | 360 | |
| 323 | 361 | ! the file can contain flags to control the running of the software and the output |
| 324 | 362 | rewind(bundle_spec_file_unit) |
| ... | ... | @@ -326,7 +364,7 @@ logical :: must_use_laplace |
| 326 | 364 | write(*,*)'Processing flags' |
| 327 | 365 | |
| 328 | 366 | do |
| 329 | - read(bundle_spec_file_unit,*,END=110,ERR=110)line | |
| 367 | + read(bundle_spec_file_unit,'(A)',END=310,ERR=310)line | |
| 330 | 368 | CALL convert_to_lower_case(line,line_length) |
| 331 | 369 | |
| 332 | 370 | ! Set flags according to the information at the end of the .spice_model_spec file |
| ... | ... | @@ -336,8 +374,7 @@ logical :: must_use_laplace |
| 336 | 374 | if (INDEX(line,'no_s_xfer').NE.0) use_s_xfer=.FALSE. |
| 337 | 375 | if (INDEX(line,'use_laplace').NE.0) use_Laplace=.TRUE. |
| 338 | 376 | if (INDEX(line,'no_laplace').NE.0) use_Laplace=.FALSE. |
| 339 | - if (INDEX(line,'use_fasthenry').NE.0) use_FastHenry=.TRUE. | |
| 340 | - if (INDEX(line,'no_fasthenry').NE.0) use_FastHenry=.FALSE. | |
| 377 | + | |
| 341 | 378 | if (INDEX(line,'plot_potential').NE.0) plot_potential=.TRUE. |
| 342 | 379 | if (INDEX(line,'no_plot_potential').NE.0) plot_potential=.FALSE. |
| 343 | 380 | if (INDEX(line,'plot_mesh').NE.0) plot_mesh=.TRUE. |
| ... | ... | @@ -376,10 +413,24 @@ logical :: must_use_laplace |
| 376 | 413 | if (INDEX(line,'cg_tol').NE.0) then |
| 377 | 414 | read(bundle_spec_file_unit,*,END=9000,ERR=9000)cg_tol |
| 378 | 415 | end if |
| 416 | + | |
| 417 | + if (INDEX(line,'no_fasthenry').NE.0) use_FastHenry=.FALSE. | |
| 418 | + | |
| 419 | + if (INDEX(line,'use_fasthenry').EQ.1) then | |
| 420 | + use_FastHenry=.TRUE. | |
| 421 | + | |
| 422 | + stripped_line=line(14:line_length) | |
| 423 | + read(stripped_line,*,ERR=305,END=305)FH2_nlayers_radius,FH2_nw,FH2_nh,FH2_rw,FH2_rh | |
| 424 | + | |
| 425 | + write(*,*)'use_FastHenry=.TRUE.' | |
| 426 | + write(*,*)'Parameters:',FH2_nlayers_radius,FH2_nw,FH2_nh,FH2_rw,FH2_rh | |
| 427 | +305 CONTINUE | |
| 379 | 428 | |
| 429 | + end if | |
| 430 | + | |
| 380 | 431 | end do ! continue until all flags are read - indicated by an end of file. |
| 381 | 432 | |
| 382 | -110 CONTINUE | |
| 433 | +310 CONTINUE | |
| 383 | 434 | |
| 384 | 435 | ! close the bundle_spec file |
| 385 | 436 | ... | ... |
SRC/spice_cable_bundle_model_builder.F90
| ... | ... | @@ -88,7 +88,7 @@ |
| 88 | 88 | ! 24/2/2017 CJS Allow the input name to include a path i.e. the _spec file does not need to be local. |
| 89 | 89 | ! 28/2/2017 CJS Make the validation test circuit model optional |
| 90 | 90 | ! 16/11/2017 CJS Include network synthesis process to replace s-domain transfer functions |
| 91 | -! | |
| 91 | +! 24/11/2023 CJS Start to embed FastHenry2 frequency dependent impedance matrix | |
| 92 | 92 | ! |
| 93 | 93 | PROGRAM spice_cable_bundle_model_builder |
| 94 | 94 | |
| ... | ... | @@ -574,6 +574,8 @@ integer :: i |
| 574 | 574 | |
| 575 | 575 | if (INDEX(line,'use_analytic_i').NE.0) run_validation_test_Vbased=.FALSE. |
| 576 | 576 | if (INDEX(line,'use_analytic_v').NE.0) run_validation_test_Vbased=.TRUE. |
| 577 | + | |
| 578 | + if (INDEX(line,'plot_propagation_correction_filter_fit_data').NE.0) plot_propagation_correction_filter_fit_data=.TRUE. | |
| 577 | 579 | |
| 578 | 580 | if (INDEX(line,'min_delay').NE.0) then |
| 579 | 581 | ... | ... |
| ... | ... | @@ -0,0 +1,1020 @@ |
| 1 | +PROGRAM write_FH_input_file | |
| 2 | + | |
| 3 | +USE type_specifications | |
| 4 | + | |
| 5 | +IMPLICIT NONE | |
| 6 | + | |
| 7 | +integer :: n_conductors | |
| 8 | + | |
| 9 | +logical :: ground_plane | |
| 10 | + | |
| 11 | +integer :: mesh_type | |
| 12 | + | |
| 13 | +real(dp) :: gp_x(3),gp_y(3),gp_z(3) | |
| 14 | + | |
| 15 | +real(dp) :: gp_t,gp_sigma,gp_rh,gp_ex1,gp_ey1,gp_ez1,gp_ex2,gp_ey2,gp_ez2 | |
| 16 | +real(dp) :: gp_skin_depth | |
| 17 | +integer :: gp_nhinc,gp_seg1,gp_seg2 | |
| 18 | + | |
| 19 | +character(len=80),allocatable :: gp_node1 | |
| 20 | +character(len=80),allocatable :: gp_node2 | |
| 21 | + | |
| 22 | +character(len=80),allocatable :: gp_node1_external | |
| 23 | +character(len=80),allocatable :: gp_node2_external | |
| 24 | + | |
| 25 | +TYPE::conductor_type | |
| 26 | + | |
| 27 | + integer :: type | |
| 28 | + integer :: mesh_type | |
| 29 | + integer :: mesh_to_layer_type | |
| 30 | + | |
| 31 | + real(dp) :: rc | |
| 32 | + real(dp) :: rci | |
| 33 | + real(dp) :: rco | |
| 34 | + real(dp) :: xc | |
| 35 | + real(dp) :: yc | |
| 36 | + real(dp) :: width | |
| 37 | + real(dp) :: height | |
| 38 | + integer :: n_layers2 | |
| 39 | + integer :: tot_n_layers | |
| 40 | + | |
| 41 | + real(dp),allocatable :: x(:) | |
| 42 | + real(dp),allocatable :: y(:) | |
| 43 | + real(dp),allocatable :: w(:) | |
| 44 | + real(dp),allocatable :: h(:) | |
| 45 | + real(dp),allocatable :: d(:) | |
| 46 | + integer,allocatable :: anwinc(:) | |
| 47 | + integer,allocatable :: anhinc(:) | |
| 48 | + | |
| 49 | + real(dp),allocatable :: wx(:) | |
| 50 | + real(dp),allocatable :: wy(:) | |
| 51 | + real(dp),allocatable :: wz(:) | |
| 52 | + | |
| 53 | + real(dp) :: sigma | |
| 54 | + real(dp) :: dl | |
| 55 | + integer :: nwinc | |
| 56 | + integer :: nhinc | |
| 57 | + real(dp) :: rw | |
| 58 | + real(dp) :: rh | |
| 59 | + | |
| 60 | + character(len=80),allocatable :: node1_list(:) | |
| 61 | + character(len=80),allocatable :: node2_list(:) | |
| 62 | + | |
| 63 | + real(dp) :: grid_dim | |
| 64 | + integer :: nxmin,nxmax,nymin,nymax | |
| 65 | + integer,allocatable :: grid(:,:) | |
| 66 | + real(dp),allocatable :: depth(:,:) | |
| 67 | + | |
| 68 | + real(dp) :: skin_depth | |
| 69 | + logical :: auto_grid_density | |
| 70 | + | |
| 71 | +END TYPE conductor_type | |
| 72 | + | |
| 73 | +integer,parameter :: type_cyl=1 | |
| 74 | +integer,parameter :: type_rect=2 | |
| 75 | +integer,parameter :: type_annulus=3 | |
| 76 | +integer,parameter :: type_gnd=4 | |
| 77 | + | |
| 78 | +integer,parameter :: mesh_type_layer=1 | |
| 79 | +integer,parameter :: mesh_type_grid=2 | |
| 80 | + | |
| 81 | +type(conductor_type),allocatable :: conductor_data(:) | |
| 82 | + | |
| 83 | +real(dp) :: fmin,fmax | |
| 84 | +real(dp) :: ndec | |
| 85 | + | |
| 86 | +real(dp) :: rh,rw | |
| 87 | +integer :: nhinc,nwinc | |
| 88 | + | |
| 89 | +real(dp) :: x,y,ymin,ymax,w,h,wx,hy | |
| 90 | +integer :: conductor,layer,layer_number,nc | |
| 91 | + | |
| 92 | +real(dp) :: angle | |
| 93 | +real(dp) :: lrc,lxc,lyc,lw,lh | |
| 94 | +real(dp) :: vx,vy | |
| 95 | + | |
| 96 | +real(dp) :: dout,din | |
| 97 | + | |
| 98 | +integer :: nxmin,nxmax,nymin,nymax,ix,iy | |
| 99 | +real(dp) :: dpt,apx,apy | |
| 100 | + | |
| 101 | +integer :: cx1,cx2 | |
| 102 | +real(dp) :: cw,ch | |
| 103 | +logical :: in_conductor | |
| 104 | + | |
| 105 | +real(dp) :: required_dl,nsd | |
| 106 | +integer :: nfilaments | |
| 107 | + | |
| 108 | +character(LEN=6) :: conductor_string | |
| 109 | +character(LEN=6) :: layer_string | |
| 110 | +character(LEN=80) :: node_string | |
| 111 | +character(LEN=80) :: segment_string | |
| 112 | +character(LEN=80) :: loop_string | |
| 113 | +character(LEN=80) :: line_string | |
| 114 | + | |
| 115 | +character(LEN=12) :: x_string,y_string,z_string | |
| 116 | + | |
| 117 | +integer :: line | |
| 118 | +character(LEN=80) :: FH2_filename | |
| 119 | +character :: type_ch | |
| 120 | + | |
| 121 | +integer :: tot_n_segments,tot_n_filaments | |
| 122 | +integer :: gp_n_segments,gp_n_filaments | |
| 123 | + | |
| 124 | +real(dp),parameter :: pi=3.1415926535 | |
| 125 | + | |
| 126 | +! START | |
| 127 | + | |
| 128 | +! READ THE PROBLEM SPECIFICATION | |
| 129 | + | |
| 130 | +line=1 | |
| 131 | +write(*,*)'Enter the name of the FastHenry2 input file to write:' | |
| 132 | +read(*,'(A80)',ERR=9000)FH2_filename | |
| 133 | + | |
| 134 | +write(*,*)"Enter the number of conductors or 'ground_plane'" | |
| 135 | +line=line+1 | |
| 136 | +read(*,'(A80)',ERR=9000)line_string | |
| 137 | +type_ch=line_string(1:1) | |
| 138 | + | |
| 139 | +if ( (type_ch.EQ.'g').OR.(type_ch.EQ.'G') ) then | |
| 140 | + | |
| 141 | + write(*,*)'Reading ground plane specification...' | |
| 142 | + ground_plane=.TRUE. | |
| 143 | + | |
| 144 | + write(*,*)'Enter the ground plane point 1 coordinates, x y z in metres' | |
| 145 | + line=line+1 | |
| 146 | + read(*,*,ERR=9000)gp_x(1),gp_y(1),gp_z(1) | |
| 147 | + write(*,*)'Enter the ground plane point 2 coordinates, x y z in metres' | |
| 148 | + line=line+1 | |
| 149 | + read(*,*,ERR=9000)gp_x(2),gp_y(2),gp_z(2) | |
| 150 | + write(*,*)'Enter the ground plane point 3 coordinates, x y z in metres' | |
| 151 | + line=line+1 | |
| 152 | + read(*,*,ERR=9000)gp_x(3),gp_y(3),gp_z(3) | |
| 153 | + | |
| 154 | + write(*,*)'Enter the ground plane thickness in metres' | |
| 155 | + line=line+1 | |
| 156 | + read(*,*,ERR=9000)gp_t | |
| 157 | + | |
| 158 | + write(*,*)'Enter the ground plane discretisation in p1-p2 and p2=p3 directions' | |
| 159 | + line=line+1 | |
| 160 | + read(*,*,ERR=9000)gp_seg1,gp_seg2 | |
| 161 | + | |
| 162 | + write(*,*)'Enter the ground conductivity in Siemens/metre' | |
| 163 | + line=line+1 | |
| 164 | + read(*,*,ERR=9000)gp_sigma | |
| 165 | + | |
| 166 | + write(*,*)'Enter the ground plane discretisation in thickness, nhinc' | |
| 167 | + line=line+1 | |
| 168 | + read(*,*,ERR=9000)gp_nhinc | |
| 169 | + | |
| 170 | + write(*,*)'Enter the ground plane discretisation in thickness ratio, rh' | |
| 171 | + line=line+1 | |
| 172 | + read(*,*,ERR=9000)gp_rh | |
| 173 | + | |
| 174 | + write(*,*)'Enter the ground plane end 1 node coordinates, x y z in metres' | |
| 175 | + line=line+1 | |
| 176 | + read(*,*,ERR=9000)gp_ex1,gp_ey1,gp_ez1 | |
| 177 | + write(*,*)'Enter the ground plane end 2 node coordinates, x y z in metres' | |
| 178 | + line=line+1 | |
| 179 | + read(*,*,ERR=9000)gp_ex2,gp_ey2,gp_ez2 | |
| 180 | + | |
| 181 | + gp_node1='Ngp_e1' | |
| 182 | + gp_node2='Ngp_e2' | |
| 183 | + | |
| 184 | + gp_node1_external='Ngp_e1_ext' | |
| 185 | + gp_node2_external='Ngp_e2_ext' | |
| 186 | + | |
| 187 | + write(*,*)"Enter the number of conductors" | |
| 188 | + line=line+1 | |
| 189 | + read(*,*,ERR=9000)n_conductors | |
| 190 | + | |
| 191 | +else | |
| 192 | + | |
| 193 | + write(*,*)'No ground plane' | |
| 194 | + ground_plane=.FALSE. | |
| 195 | + read(line_string,*,ERR=9000)n_conductors | |
| 196 | + | |
| 197 | +end if | |
| 198 | + | |
| 199 | +write(*,*)'Number of conductors (excluding ground plane)=',n_conductors | |
| 200 | + | |
| 201 | +ALLOCATE( conductor_data(n_conductors) ) | |
| 202 | + | |
| 203 | +do conductor=1,n_conductors | |
| 204 | + | |
| 205 | + write(*,*)'Enter the conductor number' | |
| 206 | + line=line+1 | |
| 207 | + read(*,*,ERR=9000)nc | |
| 208 | + | |
| 209 | + if (nc.NE.conductor) GOTO 9010 | |
| 210 | + | |
| 211 | + write(*,*)'Enter the conductor type (cylindrical rectangular or annulus)' | |
| 212 | + line=line+1 | |
| 213 | + read(*,'(A80)',ERR=9000)line_string | |
| 214 | + type_ch=line_string(1:1) | |
| 215 | + | |
| 216 | + conductor_data(conductor)%auto_grid_density=.FALSE. | |
| 217 | + | |
| 218 | + if ( (type_ch.EQ.'c').OR.(type_ch.EQ.'C') ) then | |
| 219 | + conductor_data(conductor)%type=type_cyl | |
| 220 | + | |
| 221 | +! work out the grid type | |
| 222 | + | |
| 223 | +INCLUDE "WRITE_FH2_IPFILE/get_grid_type.F90" | |
| 224 | + | |
| 225 | + write(*,*)Conductor,conductor,' mesh type=',conductor_data(conductor)%mesh_type | |
| 226 | + | |
| 227 | + write(*,*)'Enter the cylindrical conductor centre coordinates, xc yc in metres' | |
| 228 | + line=line+1 | |
| 229 | + read(*,*,ERR=9000)conductor_data(conductor)%xc,conductor_data(conductor)%yc | |
| 230 | + | |
| 231 | + write(*,*)'Enter the cylindrical conductor radius, rc in metres' | |
| 232 | + line=line+1 | |
| 233 | + read(*,*,ERR=9000)conductor_data(conductor)%rc | |
| 234 | + | |
| 235 | + write(*,*)'Enter the cylindrical conductor discretisation, dl in metres' | |
| 236 | + line=line+1 | |
| 237 | + read(*,*,ERR=9000)conductor_data(conductor)%dl | |
| 238 | + | |
| 239 | + else if ( (type_ch.EQ.'r').OR.(type_ch.EQ.'R') ) then | |
| 240 | + conductor_data(conductor)%type=type_rect | |
| 241 | + | |
| 242 | + write(*,*)'Enter the rectangular conductor centre coordinates, xc yc in metres' | |
| 243 | + line=line+1 | |
| 244 | + read(*,*,ERR=9000)conductor_data(conductor)%xc,conductor_data(conductor)%yc | |
| 245 | + | |
| 246 | + write(*,*)'Enter the rectangular conductor width (x dimension) height (y dimension) in metres' | |
| 247 | + line=line+1 | |
| 248 | + read(*,*,ERR=9000)conductor_data(conductor)%width,conductor_data(conductor)%height | |
| 249 | + | |
| 250 | + conductor_data(conductor)%n_layers2=1 | |
| 251 | + conductor_data(conductor)%tot_n_layers=1 | |
| 252 | + | |
| 253 | + else if ( (type_ch.EQ.'a').OR.(type_ch.EQ.'A') ) then | |
| 254 | + conductor_data(conductor)%type=type_annulus | |
| 255 | + | |
| 256 | +INCLUDE "WRITE_FH2_IPFILE/get_grid_type.F90" | |
| 257 | + | |
| 258 | + write(*,*)Conductor,conductor,' mesh type=',conductor_data(conductor)%mesh_type | |
| 259 | + | |
| 260 | + write(*,*)'Enter the cylindrical conductor centre coordinates, xc yc in metres' | |
| 261 | + line=line+1 | |
| 262 | + read(*,*,ERR=9000)conductor_data(conductor)%xc,conductor_data(conductor)%yc | |
| 263 | + | |
| 264 | + write(*,*)'Enter the cylindrical inner conductor radius, rci in metres' | |
| 265 | + line=line+1 | |
| 266 | + read(*,*,ERR=9000)conductor_data(conductor)%rci | |
| 267 | + | |
| 268 | + write(*,*)'Enter the cylindrical outer conductor radius, rco in metres' | |
| 269 | + line=line+1 | |
| 270 | + read(*,*,ERR=9000)conductor_data(conductor)%rco | |
| 271 | + | |
| 272 | + write(*,*)'Enter the cylindrical conductor discretisation, dl in metres' | |
| 273 | + line=line+1 | |
| 274 | + read(*,*,ERR=9000)conductor_data(conductor)%dl | |
| 275 | + | |
| 276 | + else | |
| 277 | + GOTO 9020 | |
| 278 | + end if ! Conductor type | |
| 279 | + | |
| 280 | + write(*,*)'Enter the conductor conductivity, sigma in Siemens/metre' | |
| 281 | + line=line+1 | |
| 282 | + read(*,*,ERR=9000)conductor_data(conductor)%sigma | |
| 283 | + | |
| 284 | + write(*,*)'Enter the conductor discretisations, nwinc nhinc' | |
| 285 | + line=line+1 | |
| 286 | + read(*,*,ERR=9000)conductor_data(conductor)%nwinc,conductor_data(conductor)%nhinc | |
| 287 | + | |
| 288 | + write(*,*)'Enter the conductor discretisation ratios, rw rh' | |
| 289 | + line=line+1 | |
| 290 | + read(*,*,ERR=9000)conductor_data(conductor)%rw,conductor_data(conductor)%rh | |
| 291 | + | |
| 292 | + if (conductor_data(conductor)%auto_grid_density) then ! uniform grid in segments | |
| 293 | + conductor_data(conductor)%rw=1.0 | |
| 294 | + conductor_data(conductor)%rh=1.0 | |
| 295 | + end if | |
| 296 | + | |
| 297 | +end do ! read next conductor | |
| 298 | + | |
| 299 | +! Read the frequency range data | |
| 300 | + | |
| 301 | +write(*,*)'Enter the minimum frequency, fmin (Hz)' | |
| 302 | +line=line+1 | |
| 303 | +read(*,*,ERR=9000)fmin | |
| 304 | + | |
| 305 | +write(*,*)'Enter the maximum frequency, fmax (Hz)' | |
| 306 | +line=line+1 | |
| 307 | +read(*,*,ERR=9000)fmax | |
| 308 | + | |
| 309 | +write(*,*)'Enter the number of frequency samples per decade, ndec' | |
| 310 | +line=line+1 | |
| 311 | +read(*,*,ERR=9000)ndec | |
| 312 | + | |
| 313 | +! END OF PROBLEM SPECIFICATION | |
| 314 | + | |
| 315 | +open(unit=20,file=trim(FH2_filename)) | |
| 316 | + | |
| 317 | +open(unit=10,file='cross_section.dat') | |
| 318 | +open(unit=12,file='grid.dat') | |
| 319 | + | |
| 320 | +! write header | |
| 321 | +write(20,'(A)')'* conductors in free space' | |
| 322 | +write(20,'(A)')'*' | |
| 323 | +write(20,'(A)')'.units m' | |
| 324 | +write(20,'(A)')'*' | |
| 325 | + | |
| 326 | +! WORK OUT THE SKIN DEPTH IN EACH CONDUCTOR | |
| 327 | + | |
| 328 | +if (ground_plane) then | |
| 329 | + gp_skin_depth=sqrt(1.0/(pi*fmax*4.0*pi*1e-7*gp_sigma)) | |
| 330 | + write(*,*)'Minimum ground plane skin depth =',gp_skin_depth | |
| 331 | +end if | |
| 332 | + | |
| 333 | +do conductor=1,n_conductors | |
| 334 | + | |
| 335 | + conductor_data(conductor)%skin_depth=sqrt(1.0/(pi*fmax*4.0*pi*1e-7*conductor_data(conductor)%sigma)) | |
| 336 | + write(*,*)'Conductor',conductor,' Minimum skin depth =',conductor_data(conductor)%skin_depth | |
| 337 | + | |
| 338 | +end do ! next conductor | |
| 339 | + | |
| 340 | +! ALLOCATE GRIDS IN CONDUCTORS IF REQUIRED... | |
| 341 | + | |
| 342 | +do conductor=1,n_conductors | |
| 343 | + | |
| 344 | + if (conductor_data(conductor)%type.EQ.type_cyl) then | |
| 345 | + | |
| 346 | + if (conductor_data(conductor)%mesh_type.EQ.mesh_type_layer) then | |
| 347 | + | |
| 348 | + conductor_data(conductor)%n_layers2=NINT(conductor_data(conductor)%rc/conductor_data(conductor)%dl) | |
| 349 | + conductor_data(conductor)%tot_n_layers=2*conductor_data(conductor)%n_layers2 | |
| 350 | + | |
| 351 | + else if (conductor_data(conductor)%mesh_type.EQ.mesh_type_grid) then | |
| 352 | + | |
| 353 | +! allocate grid for the circular geometry | |
| 354 | + conductor_data(conductor)%grid_dim=conductor_data(conductor)%rc | |
| 355 | + | |
| 356 | +INCLUDE "WRITE_FH2_IPFILE/create_grid.F90" | |
| 357 | + | |
| 358 | +! Loop over the grid and set segments within the conductor | |
| 359 | + | |
| 360 | + conductor_data(conductor)%tot_n_layers=0 | |
| 361 | + | |
| 362 | + do ix=nxmin,nxmax | |
| 363 | + do iy=nymin,nymax | |
| 364 | + dpt=conductor_data(conductor)%dl*sqrt(real(ix)**2+real(iy)**2) | |
| 365 | + if ( dpt.LE.conductor_data(conductor)%rc ) then | |
| 366 | + conductor_data(conductor)%grid(ix,iy)=1 | |
| 367 | + conductor_data(conductor)%depth(ix,iy)=conductor_data(conductor)%rc-dpt | |
| 368 | + conductor_data(conductor)%tot_n_layers=conductor_data(conductor)%tot_n_layers+1 | |
| 369 | + end if | |
| 370 | + end do | |
| 371 | + end do | |
| 372 | + | |
| 373 | + conductor_data(conductor)%n_layers2=0 | |
| 374 | + | |
| 375 | + else | |
| 376 | + write(*,*)'Unknown grid type' | |
| 377 | + STOP 1 | |
| 378 | + end if | |
| 379 | + | |
| 380 | + else if (conductor_data(conductor)%type.EQ.type_annulus) then | |
| 381 | + | |
| 382 | + | |
| 383 | + if (conductor_data(conductor)%mesh_type.EQ.mesh_type_layer) then | |
| 384 | + | |
| 385 | + conductor_data(conductor)%n_layers2=0 | |
| 386 | + conductor_data(conductor)%tot_n_layers=20 ! number of segments in the loop | |
| 387 | + | |
| 388 | + else if (conductor_data(conductor)%mesh_type.EQ.mesh_type_grid) then | |
| 389 | + | |
| 390 | +! allocate grid for the annular geometry | |
| 391 | + | |
| 392 | + conductor_data(conductor)%grid_dim=conductor_data(conductor)%rco | |
| 393 | + | |
| 394 | +INCLUDE "WRITE_FH2_IPFILE/create_grid.F90" | |
| 395 | + | |
| 396 | +! Loop over the grid and set segments within the annular conductor | |
| 397 | + | |
| 398 | + conductor_data(conductor)%tot_n_layers=0 | |
| 399 | + | |
| 400 | + do ix=nxmin,nxmax | |
| 401 | + do iy=nymin,nymax | |
| 402 | + dpt=conductor_data(conductor)%dl*sqrt(real(ix)**2+real(iy)**2) | |
| 403 | + if ( (dpt.GE.conductor_data(conductor)%rci).AND.(dpt.LE.conductor_data(conductor)%rco) ) then | |
| 404 | + conductor_data(conductor)%grid(ix,iy)=1 | |
| 405 | + dout=conductor_data(conductor)%rco-dpt | |
| 406 | + din=dpt-conductor_data(conductor)%rci | |
| 407 | + conductor_data(conductor)%depth(ix,iy)=min(dout,din) | |
| 408 | + conductor_data(conductor)%tot_n_layers=conductor_data(conductor)%tot_n_layers+1 | |
| 409 | + end if | |
| 410 | + end do | |
| 411 | + end do | |
| 412 | + | |
| 413 | + conductor_data(conductor)%n_layers2=0 | |
| 414 | + | |
| 415 | + else | |
| 416 | + | |
| 417 | + write(*,*)'We can only use the grid mesh type for an annulus' | |
| 418 | + STOP 1 | |
| 419 | + | |
| 420 | + end if ! mesh type grid | |
| 421 | + | |
| 422 | + end if ! annular | |
| 423 | + | |
| 424 | +end do ! next conductor | |
| 425 | + | |
| 426 | +! WRITE GROUND PLANE INFORMATION IF REQUIRED | |
| 427 | + | |
| 428 | +gp_n_segments=0 | |
| 429 | +gp_n_filaments=0 | |
| 430 | + | |
| 431 | +if (ground_plane) then | |
| 432 | + | |
| 433 | + write(20,'(A)')'*' | |
| 434 | + write(20,'(A)')'* Ground plane' | |
| 435 | + write(20,'(A,ES12.4,A,ES12.4,A,ES12.4)')'ground_plane x1=',gp_x(1),' y1=',gp_y(1),' z1=',gp_z(1) | |
| 436 | + write(20,'(A,ES12.4,A,ES12.4,A,ES12.4)')'+ x2=',gp_x(2),' y2=',gp_y(2),' z2=',gp_z(2) | |
| 437 | + write(20,'(A,ES12.4,A,ES12.4,A,ES12.4)')'+ x3=',gp_x(3),' y3=',gp_y(3),' z3=',gp_z(3) | |
| 438 | + write(20,'(A,ES12.4)')'+ thick=',gp_t | |
| 439 | + write(20,'(A,ES12.4)')'+ sigma=',gp_sigma | |
| 440 | + write(20,'(A,I4)')'+ nhinc=',gp_nhinc | |
| 441 | + write(20,'(A,ES12.4)')'+ rh=',gp_rh | |
| 442 | + write(20,'(A,I4,A,I4)')'+ seg1=',gp_seg1,' seg2=',gp_seg2 | |
| 443 | + | |
| 444 | + gp_n_segments =(gp_seg1+1)*gp_seg2+(gp_seg2+1)*gp_seg1 | |
| 445 | + gp_n_filaments=gp_nhinc*gp_n_segments | |
| 446 | + | |
| 447 | + write(x_string,'(ES12.4)')gp_ex1 | |
| 448 | + write(y_string,'(ES12.4)')gp_ey1 | |
| 449 | + write(z_string,'(ES12.4)')gp_ez1 | |
| 450 | + write(20,'(9A)')'+ ',trim(gp_node1),' (',trim(adjustl(x_string)), & | |
| 451 | + ',',trim(adjustl(y_string)), & | |
| 452 | + ',',trim(adjustl(z_string)),')' | |
| 453 | + | |
| 454 | + write(x_string,'(ES12.4)')gp_ex2 | |
| 455 | + write(y_string,'(ES12.4)')gp_ey2 | |
| 456 | + write(z_string,'(ES12.4)')gp_ez2 | |
| 457 | + write(20,'(9A)')'+ ',trim(gp_node2),' (',trim(adjustl(x_string)), & | |
| 458 | + ',',trim(adjustl(y_string)), & | |
| 459 | + ',',trim(adjustl(z_string)),')' | |
| 460 | + | |
| 461 | +end if | |
| 462 | + | |
| 463 | +! LOOP OVER THE CONDUCTORS AND DEFINE THEN WRITE THE NODES FOR EACH LAYER ON THE CONDUCTOR | |
| 464 | + | |
| 465 | +write(20,'(A)')'*' | |
| 466 | +write(20,'(A)')'* Specify the conductor nodes' | |
| 467 | +do conductor=1,n_conductors | |
| 468 | + | |
| 469 | + write(20,'(A)')'*' | |
| 470 | + write(20,'(A,I4)')'* Conductor',conductor | |
| 471 | + | |
| 472 | + write(conductor_string,'(I4)')conductor | |
| 473 | + | |
| 474 | + ALLOCATE( conductor_data(conductor)%x(1:conductor_data(conductor)%tot_n_layers) ) | |
| 475 | + ALLOCATE( conductor_data(conductor)%y(1:conductor_data(conductor)%tot_n_layers) ) | |
| 476 | + ALLOCATE( conductor_data(conductor)%w(1:conductor_data(conductor)%tot_n_layers) ) | |
| 477 | + ALLOCATE( conductor_data(conductor)%h(1:conductor_data(conductor)%tot_n_layers) ) | |
| 478 | + ALLOCATE( conductor_data(conductor)%d(1:conductor_data(conductor)%tot_n_layers) ) | |
| 479 | + ALLOCATE( conductor_data(conductor)%anwinc(1:conductor_data(conductor)%tot_n_layers) ) | |
| 480 | + ALLOCATE( conductor_data(conductor)%anhinc(1:conductor_data(conductor)%tot_n_layers) ) | |
| 481 | + | |
| 482 | + ALLOCATE( conductor_data(conductor)%wx(1:conductor_data(conductor)%tot_n_layers) ) | |
| 483 | + ALLOCATE( conductor_data(conductor)%wy(1:conductor_data(conductor)%tot_n_layers) ) | |
| 484 | + ALLOCATE( conductor_data(conductor)%wz(1:conductor_data(conductor)%tot_n_layers) ) | |
| 485 | + | |
| 486 | + conductor_data(conductor)%wx(1:conductor_data(conductor)%tot_n_layers)=1.0 | |
| 487 | + conductor_data(conductor)%wy(1:conductor_data(conductor)%tot_n_layers)=0.0 | |
| 488 | + conductor_data(conductor)%wz(1:conductor_data(conductor)%tot_n_layers)=0.0 | |
| 489 | + | |
| 490 | + ALLOCATE( conductor_data(conductor)%node1_list(1:conductor_data(conductor)%tot_n_layers) ) | |
| 491 | + ALLOCATE( conductor_data(conductor)%node2_list(1:conductor_data(conductor)%tot_n_layers) ) | |
| 492 | + | |
| 493 | + if (conductor_data(conductor)%type.EQ.type_cyl) then | |
| 494 | + | |
| 495 | + if (conductor_data(conductor)%mesh_type.EQ.mesh_type_layer) then | |
| 496 | + | |
| 497 | + do layer=-conductor_data(conductor)%n_layers2+1,conductor_data(conductor)%n_layers2 | |
| 498 | + | |
| 499 | + layer_number=conductor_data(conductor)%n_layers2+layer | |
| 500 | + | |
| 501 | + ymin=conductor_data(conductor)%dl*real(layer) | |
| 502 | + ymax=conductor_data(conductor)%dl*real(layer-1) | |
| 503 | + y=(ymin+ymax)/2.0 | |
| 504 | + x=sqrt(conductor_data(conductor)%rc**2-y**2) | |
| 505 | + | |
| 506 | + conductor_data(conductor)%x(layer_number)=conductor_data(conductor)%xc | |
| 507 | + conductor_data(conductor)%y(layer_number)=conductor_data(conductor)%yc+y | |
| 508 | + conductor_data(conductor)%w(layer_number)=2.0*x | |
| 509 | + conductor_data(conductor)%h(layer_number)=conductor_data(conductor)%dl | |
| 510 | + conductor_data(conductor)%d(layer_number)=0.0 | |
| 511 | + conductor_data(conductor)%anwinc(layer_number)=conductor_data(conductor)%nwinc | |
| 512 | + conductor_data(conductor)%anhinc(layer_number)=conductor_data(conductor)%nwinc | |
| 513 | + | |
| 514 | + end do ! next layer | |
| 515 | + | |
| 516 | + else if (conductor_data(conductor)%mesh_type.EQ.mesh_type_grid) then | |
| 517 | + | |
| 518 | +! Loop over the grid and set segments within the circular conductor | |
| 519 | + | |
| 520 | +INCLUDE "WRITE_FH2_IPFILE/set_segments_from_grid.F90" | |
| 521 | + | |
| 522 | + end if ! mesh_type_grid | |
| 523 | + | |
| 524 | + else if (conductor_data(conductor)%type.EQ.type_rect) then | |
| 525 | + | |
| 526 | + layer_number=1 | |
| 527 | + | |
| 528 | + conductor_data(conductor)%x(layer_number)=conductor_data(conductor)%xc | |
| 529 | + conductor_data(conductor)%y(layer_number)=conductor_data(conductor)%yc | |
| 530 | + conductor_data(conductor)%w(layer_number)=conductor_data(conductor)%width | |
| 531 | + conductor_data(conductor)%h(layer_number)=conductor_data(conductor)%height | |
| 532 | + conductor_data(conductor)%d(layer_number)=0.0 | |
| 533 | + conductor_data(conductor)%anwinc(layer_number)=conductor_data(conductor)%nwinc | |
| 534 | + conductor_data(conductor)%anhinc(layer_number)=conductor_data(conductor)%nwinc | |
| 535 | + | |
| 536 | + else if (conductor_data(conductor)%type.EQ.type_annulus) then | |
| 537 | + | |
| 538 | + if (conductor_data(conductor)%mesh_type.EQ.mesh_type_layer) then | |
| 539 | + | |
| 540 | + do layer_number=1,conductor_data(conductor)%tot_n_layers | |
| 541 | + | |
| 542 | + angle=real(layer_number)*2.0*pi/real(conductor_data(conductor)%tot_n_layers) | |
| 543 | + conductor_data(conductor)%wx(layer_number)=-sin(angle) | |
| 544 | + conductor_data(conductor)%wy(layer_number)=cos(angle) | |
| 545 | + conductor_data(conductor)%wz(layer_number)=0.0 | |
| 546 | + | |
| 547 | + lrc=(conductor_data(conductor)%rco+conductor_data(conductor)%rci)/2.0 | |
| 548 | + lh=(conductor_data(conductor)%rco-conductor_data(conductor)%rci)/2.0 | |
| 549 | + lw=lrc*2.0*pi/real(conductor_data(conductor)%tot_n_layers) | |
| 550 | + lxc=lrc*cos(angle) | |
| 551 | + lyc=lrc*sin(angle) | |
| 552 | + | |
| 553 | + conductor_data(conductor)%x(layer_number)=conductor_data(conductor)%xc+lxc | |
| 554 | + conductor_data(conductor)%y(layer_number)=conductor_data(conductor)%yc+lyc | |
| 555 | + conductor_data(conductor)%w(layer_number)=lw | |
| 556 | + conductor_data(conductor)%h(layer_number)=lh | |
| 557 | + conductor_data(conductor)%d(layer_number)=0.0 | |
| 558 | + conductor_data(conductor)%anwinc(layer_number)=conductor_data(conductor)%nwinc | |
| 559 | + conductor_data(conductor)%anhinc(layer_number)=conductor_data(conductor)%nwinc | |
| 560 | + | |
| 561 | + end do ! next layer | |
| 562 | + | |
| 563 | + else if (conductor_data(conductor)%mesh_type.EQ.mesh_type_grid) then | |
| 564 | + | |
| 565 | +! Loop over the grid and set segments within the circular conductor | |
| 566 | + | |
| 567 | +INCLUDE "WRITE_FH2_IPFILE/set_segments_from_grid.F90" | |
| 568 | + | |
| 569 | + end if ! mesh_type_grid | |
| 570 | + | |
| 571 | + else | |
| 572 | + write(*,*)'Cant deal with this conductor type yet:',conductor_data(conductor)%type | |
| 573 | + STOP 1 | |
| 574 | + end if | |
| 575 | + | |
| 576 | +! WRITE_THE NODES TO THE INPUT FILE AND SAVE IN THE NODE LIST FOR THIS CONDUCTOR | |
| 577 | + | |
| 578 | + do layer_number=1,conductor_data(conductor)%tot_n_layers | |
| 579 | + | |
| 580 | + write(layer_string,'(I4)')layer_number | |
| 581 | + | |
| 582 | + node_string='n_c'//trim(adjustl(conductor_string))//'_e1_l'//trim(adjustl(layer_string)) | |
| 583 | + write(20,'(A,A,ES12.4,A,ES12.4,A)')trim(node_string), & | |
| 584 | + ' x=',conductor_data(conductor)%x(layer_number), & | |
| 585 | + ' y=',conductor_data(conductor)%y(layer_number),' z=0.0' | |
| 586 | + conductor_data(conductor)%node1_list(layer_number)=node_string | |
| 587 | + | |
| 588 | + node_string='n_c'//trim(adjustl(conductor_string))//'_e2_l'//trim(adjustl(layer_string)) | |
| 589 | + write(20,'(A,A,ES12.4,A,ES12.4,A)')trim(node_string), & | |
| 590 | + ' x=',conductor_data(conductor)%x(layer_number), & | |
| 591 | + ' y=',conductor_data(conductor)%y(layer_number),' z=1.0' | |
| 592 | + conductor_data(conductor)%node2_list(layer_number)=node_string | |
| 593 | + | |
| 594 | + wx=conductor_data(conductor)%w(layer_number)/2.0 | |
| 595 | + hy=conductor_data(conductor)%h(layer_number)/2.0 | |
| 596 | + rw=conductor_data(conductor)%rw | |
| 597 | + rh=conductor_data(conductor)%rh | |
| 598 | + nwinc=conductor_data(conductor)%anwinc(layer_number) | |
| 599 | + nhinc=conductor_data(conductor)%anhinc(layer_number) | |
| 600 | + | |
| 601 | + vx=conductor_data(conductor)%wx(layer_number) | |
| 602 | + vy=conductor_data(conductor)%wy(layer_number) | |
| 603 | + | |
| 604 | + CALL plot_layer(conductor_data(conductor)%x(layer_number),conductor_data(conductor)%y(layer_number), & | |
| 605 | + wx,hy,vx,vy,10) | |
| 606 | + | |
| 607 | + CALL plot_grid(conductor_data(conductor)%x(layer_number),conductor_data(conductor)%y(layer_number), & | |
| 608 | + wx,hy,vx,vy,rw,rh,nwinc,nhinc,12) | |
| 609 | + | |
| 610 | + end do ! next layer | |
| 611 | + | |
| 612 | +end do ! next conductor | |
| 613 | + | |
| 614 | +! LOOP OVER THE CONDUCTORS AND WRITE THE WIRE SEGMENTS FOR EACH LAYER ON THE CONDUCTOR | |
| 615 | + | |
| 616 | +tot_n_segments=0 | |
| 617 | +tot_n_filaments=0 | |
| 618 | + | |
| 619 | +write(20,'(A)')'*' | |
| 620 | +write(20,'(A)')'* conductor segments' | |
| 621 | +do conductor=1,n_conductors | |
| 622 | + | |
| 623 | + write(20,'(A)')'*' | |
| 624 | + write(20,'(A,I4)')'* Conductor',conductor | |
| 625 | + | |
| 626 | + write(conductor_string,'(I4)')conductor | |
| 627 | + | |
| 628 | + do layer_number=1,conductor_data(conductor)%tot_n_layers | |
| 629 | + | |
| 630 | + write(layer_string,'(I4)')layer_number | |
| 631 | + | |
| 632 | + segment_string='E_c'//trim(adjustl(conductor_string))//'_l'//trim(adjustl(layer_string)) | |
| 633 | + | |
| 634 | + write(20,'(A,A,A,A,A,A,ES12.4,A,ES12.4,A,ES12.4,A,ES12.4,A,ES12.4,A,ES12.4,A,I4,A,I4,A,ES12.4,A,ES12.4)') & | |
| 635 | + trim(segment_string),' ', & | |
| 636 | + trim(conductor_data(conductor)%node1_list(layer_number)),' ', & | |
| 637 | + trim(conductor_data(conductor)%node2_list(layer_number)), & | |
| 638 | + ' h=',conductor_data(conductor)%h(layer_number), & | |
| 639 | + ' w=',conductor_data(conductor)%w(layer_number), & | |
| 640 | + ' sigma=',conductor_data(conductor)%sigma, & | |
| 641 | + ' wx=',conductor_data(conductor)%wx(layer_number), & | |
| 642 | + ' wy=',conductor_data(conductor)%wy(layer_number), & | |
| 643 | + ' wz=',conductor_data(conductor)%wz(layer_number), & | |
| 644 | + ' nhinc=',conductor_data(conductor)%anhinc(layer_number), & | |
| 645 | + ' nwinc=',conductor_data(conductor)%anwinc(layer_number), & | |
| 646 | + ' rh=',conductor_data(conductor)%rh, & | |
| 647 | + ' rw=',conductor_data(conductor)%rw | |
| 648 | + | |
| 649 | + tot_n_segments=tot_n_segments+1 | |
| 650 | + tot_n_filaments=tot_n_filaments+conductor_data(conductor)%nhinc*conductor_data(conductor)%nwinc | |
| 651 | + | |
| 652 | + end do | |
| 653 | + | |
| 654 | +end do | |
| 655 | + | |
| 656 | +! EQUIVALENCE CONDUCTOR NODES AT NEAR END | |
| 657 | + | |
| 658 | +write(20,'(A)')'*' | |
| 659 | +write(20,'(A)')'* Near end equivalent nodes on conductors' | |
| 660 | +do conductor=1,n_conductors | |
| 661 | + | |
| 662 | + if (conductor_data(conductor)%tot_n_layers.GT.1) then | |
| 663 | + | |
| 664 | + write(20,'(A)')'*' | |
| 665 | + write(20,'(A,I4)')'* Conductor',conductor | |
| 666 | + | |
| 667 | + write(20,'(A)')'.equiv' | |
| 668 | + do layer_number=1,conductor_data(conductor)%tot_n_layers | |
| 669 | + write(20,'(A,A)')'+ ',trim(conductor_data(conductor)%node1_list(layer_number)) | |
| 670 | + end do | |
| 671 | + | |
| 672 | + end if | |
| 673 | + | |
| 674 | +end do | |
| 675 | + | |
| 676 | +! EQUIVALENCE CONDUCTOR NODES AT FAR END | |
| 677 | + | |
| 678 | +write(20,'(A)')'*' | |
| 679 | +write(20,'(A)')'* Far end equivalent nodes on conductors' | |
| 680 | +do conductor=1,n_conductors | |
| 681 | + | |
| 682 | + if (conductor_data(conductor)%tot_n_layers.GT.1) then | |
| 683 | + | |
| 684 | + write(20,'(A)')'*' | |
| 685 | + write(20,'(A,I4)')'* Conductor',conductor | |
| 686 | + | |
| 687 | + write(20,'(A)')'.equiv' | |
| 688 | + do layer_number=1,conductor_data(conductor)%tot_n_layers | |
| 689 | + write(20,'(A,A)')'+ ',trim(conductor_data(conductor)%node2_list(layer_number)) | |
| 690 | + end do | |
| 691 | + | |
| 692 | + end if | |
| 693 | + | |
| 694 | +end do | |
| 695 | + | |
| 696 | +! DEFINE LOOPS | |
| 697 | + | |
| 698 | +if (ground_plane) then | |
| 699 | + | |
| 700 | + write(20,'(A)')'*' | |
| 701 | + write(20,'(A)')'* Make loops from ground plane to all other conductors in turn' | |
| 702 | + | |
| 703 | + do conductor=1,n_conductors | |
| 704 | + | |
| 705 | + write(20,'(A)')'*' | |
| 706 | + write(20,'(A,I4)')'* Ground plane to conductor',conductor | |
| 707 | + | |
| 708 | + write(conductor_string,'(I4)')conductor | |
| 709 | + loop_string='loop_'//trim(adjustl(conductor_string)) | |
| 710 | + | |
| 711 | + write(20,'(A,A,A,A,A,A)')'.external ',trim(gp_node1), & | |
| 712 | + ' ',trim(conductor_data(conductor)%node1_list(1)), & | |
| 713 | + ' ',trim(loop_string) | |
| 714 | + end do | |
| 715 | + | |
| 716 | +! JOIN ALL FAR END CONDUCTORS | |
| 717 | + | |
| 718 | + write(20,'(A)')'*' | |
| 719 | + write(20,'(A)')'* Join all Far end conductors' | |
| 720 | + | |
| 721 | + write(20,'(A)',ADVANCE='NO')'.equiv' | |
| 722 | + write(20,'(A,A)',ADVANCE='NO')' ',trim(gp_node2) | |
| 723 | + do conductor=1,n_conductors | |
| 724 | + | |
| 725 | + layer_number=1 | |
| 726 | + write(20,'(A,A)',ADVANCE='NO')' ',trim(conductor_data(conductor)%node2_list(layer_number)) | |
| 727 | + | |
| 728 | + end do | |
| 729 | + | |
| 730 | + write(20,*) | |
| 731 | + | |
| 732 | +else | |
| 733 | +! No ground plane | |
| 734 | + | |
| 735 | + write(20,'(A)')'*' | |
| 736 | + write(20,'(A)')'* Make loops from conductor 1 to all other conductors in turn' | |
| 737 | + | |
| 738 | + do conductor=2,n_conductors | |
| 739 | + | |
| 740 | + write(20,'(A)')'*' | |
| 741 | + write(20,'(A,I4)')'* Conductor 1 to conductor',conductor | |
| 742 | + | |
| 743 | + write(conductor_string,'(I4)')conductor-1 | |
| 744 | + loop_string='loop_'//trim(adjustl(conductor_string)) | |
| 745 | + | |
| 746 | + write(20,'(A,A,A,A,A,A)')'.external ',trim(conductor_data(1)%node1_list(1)), & | |
| 747 | + ' ',trim(conductor_data(conductor)%node1_list(1)), & | |
| 748 | + ' ',trim(loop_string) | |
| 749 | + end do | |
| 750 | + | |
| 751 | +! JOIN ALL FAR END CONDUCTORS | |
| 752 | + | |
| 753 | + write(20,'(A)')'*' | |
| 754 | + write(20,'(A)')'* Join all Far end conductors' | |
| 755 | + | |
| 756 | + write(20,'(A)',ADVANCE='NO')'.equiv' | |
| 757 | + do conductor=1,n_conductors | |
| 758 | + | |
| 759 | + layer_number=1 | |
| 760 | + write(20,'(A,A)',ADVANCE='NO')' ',trim(conductor_data(conductor)%node2_list(layer_number)) | |
| 761 | + | |
| 762 | + end do | |
| 763 | + | |
| 764 | + write(20,*) | |
| 765 | + | |
| 766 | +end if ! ground plane | |
| 767 | + | |
| 768 | +! WRITE THE FREQUENCY RANGE AND END | |
| 769 | + | |
| 770 | +write(20,'(A)')'*' | |
| 771 | +write(20,'(A,ES12.4,A,ES12.4,A,ES12.4)')'.freq fmin=',fmin,' fmax=',fmax,' ndec=',ndec | |
| 772 | +write(20,'(A)')'*' | |
| 773 | +write(20,'(A)')'.end' | |
| 774 | + | |
| 775 | +! CLOSE FILES | |
| 776 | + | |
| 777 | +close(unit=10) | |
| 778 | +close(unit=12) | |
| 779 | +close(unit=20) | |
| 780 | + | |
| 781 | +! DEALLOCATE MEMORY | |
| 782 | + | |
| 783 | +do conductor=1,n_conductors | |
| 784 | + | |
| 785 | + if (ALLOCATED( conductor_data(conductor)%x )) DEALLOCATE( conductor_data(conductor)%x ) | |
| 786 | + if (ALLOCATED( conductor_data(conductor)%y )) DEALLOCATE( conductor_data(conductor)%y ) | |
| 787 | + if (ALLOCATED( conductor_data(conductor)%w )) DEALLOCATE( conductor_data(conductor)%w ) | |
| 788 | + if (ALLOCATED( conductor_data(conductor)%h )) DEALLOCATE( conductor_data(conductor)%h ) | |
| 789 | + | |
| 790 | + if (ALLOCATED( conductor_data(conductor)%wx )) DEALLOCATE( conductor_data(conductor)%wx ) | |
| 791 | + if (ALLOCATED( conductor_data(conductor)%wy )) DEALLOCATE( conductor_data(conductor)%wy ) | |
| 792 | + if (ALLOCATED( conductor_data(conductor)%wz )) DEALLOCATE( conductor_data(conductor)%wz ) | |
| 793 | + | |
| 794 | + if (ALLOCATED( conductor_data(conductor)%d )) DEALLOCATE( conductor_data(conductor)%d ) | |
| 795 | + if (ALLOCATED( conductor_data(conductor)%anwinc )) DEALLOCATE( conductor_data(conductor)%anwinc ) | |
| 796 | + if (ALLOCATED( conductor_data(conductor)%anhinc )) DEALLOCATE( conductor_data(conductor)%anhinc ) | |
| 797 | + | |
| 798 | + if (ALLOCATED( conductor_data(conductor)%node1_list )) DEALLOCATE( conductor_data(conductor)%node1_list ) | |
| 799 | + if (ALLOCATED( conductor_data(conductor)%node2_list )) DEALLOCATE( conductor_data(conductor)%node2_list ) | |
| 800 | + | |
| 801 | + if (ALLOCATED( conductor_data(conductor)%grid )) DEALLOCATE( conductor_data(conductor)%grid ) | |
| 802 | + if (ALLOCATED( conductor_data(conductor)%depth )) DEALLOCATE( conductor_data(conductor)%depth ) | |
| 803 | + | |
| 804 | +end do | |
| 805 | + | |
| 806 | +if ( ALLOCATED(conductor_data) ) DEALLOCATE( conductor_data ) | |
| 807 | + | |
| 808 | +write(*,*) | |
| 809 | +write(*,*)'Total number of conductor segments =',tot_n_segments | |
| 810 | +write(*,*)'Total number of conductor filaments=',tot_n_filaments | |
| 811 | +write(*,*) | |
| 812 | + | |
| 813 | +if (ground_plane) then | |
| 814 | + write(*,*)'Total number of ground plane segments =',gp_n_segments | |
| 815 | + write(*,*)'Total number of ground plane filaments=',gp_n_filaments | |
| 816 | + write(*,*) | |
| 817 | +end if | |
| 818 | + | |
| 819 | +write(*,*)'Total number of segments =',gp_n_segments+tot_n_segments | |
| 820 | +write(*,*)'Total number of filaments=',gp_n_filaments+tot_n_filaments | |
| 821 | +write(*,*) | |
| 822 | + | |
| 823 | +STOP 0 | |
| 824 | + | |
| 825 | +9000 write(*,*)'ERROR reading the Cross Section Specification data, line',line | |
| 826 | +STOP 1 | |
| 827 | + | |
| 828 | +9010 write(*,*)'ERROR conductors should be numbered in order, line',line | |
| 829 | +STOP 1 | |
| 830 | + | |
| 831 | +9020 write(*,*)'ERROR Unknown conductor type:',type_ch,', line',line | |
| 832 | +STOP 1 | |
| 833 | + | |
| 834 | + | |
| 835 | +END PROGRAM write_FH_input_file | |
| 836 | +! | |
| 837 | +! ___________________________________________________ | |
| 838 | +! | |
| 839 | +! | |
| 840 | +SUBROUTINE plot_layer(xc,yc,wx,wy,vxx,vxy,file_unit) | |
| 841 | + | |
| 842 | +USE type_specifications | |
| 843 | + | |
| 844 | +IMPLICIT NONE | |
| 845 | + | |
| 846 | +! variables passed to subroutine | |
| 847 | + | |
| 848 | +real(dp) :: xc,yc,wx,wy,vxx,vxy | |
| 849 | +integer :: file_unit | |
| 850 | + | |
| 851 | +! local variables | |
| 852 | + | |
| 853 | +real(dp) :: rotx,roty | |
| 854 | + | |
| 855 | +! START | |
| 856 | + | |
| 857 | + CALL rotate(-wx,+wy,vxx,vxy,rotx,roty) | |
| 858 | + write(file_unit,*)xc+rotx,yc+roty | |
| 859 | + CALL rotate(+wx,+wy,vxx,vxy,rotx,roty) | |
| 860 | + write(file_unit,*)xc+rotx,yc+roty | |
| 861 | + CALL rotate(+wx,-wy,vxx,vxy,rotx,roty) | |
| 862 | + write(file_unit,*)xc+rotx,yc+roty | |
| 863 | + CALL rotate(-wx,-wy,vxx,vxy,rotx,roty) | |
| 864 | + write(file_unit,*)xc+rotx,yc+roty | |
| 865 | + CALL rotate(-wx,+wy,vxx,vxy,rotx,roty) | |
| 866 | + write(file_unit,*)xc+rotx,yc+roty | |
| 867 | + write(file_unit,*) | |
| 868 | + | |
| 869 | +RETURN | |
| 870 | + | |
| 871 | +END SUBROUTINE plot_layer | |
| 872 | +! | |
| 873 | +! _______________________________________________________ | |
| 874 | +! | |
| 875 | +! | |
| 876 | +SUBROUTINE plot_grid(xc,yc,wx,wy,vxx,vxy,rx,ry,nx,ny,file_unit) | |
| 877 | + | |
| 878 | +USE type_specifications | |
| 879 | + | |
| 880 | +IMPLICIT NONE | |
| 881 | + | |
| 882 | +! variables passed to subroutine | |
| 883 | + | |
| 884 | +real(dp) :: xc,yc,wx,wy,vxx,vxy,rx,ry | |
| 885 | +integer :: nx,ny,file_unit | |
| 886 | + | |
| 887 | +! local variables | |
| 888 | + | |
| 889 | +real(dp) :: dx,dy,den,ox,oy | |
| 890 | +integer :: nl2 | |
| 891 | +integer :: i | |
| 892 | +logical :: odd | |
| 893 | +real(dp) :: rotx,roty | |
| 894 | + | |
| 895 | +! START | |
| 896 | + | |
| 897 | +! lines in the x direction | |
| 898 | +if ( mod(nx,2).EQ.0 ) then | |
| 899 | + odd=.FALSE. | |
| 900 | +else | |
| 901 | + odd=.TRUE. | |
| 902 | +end if | |
| 903 | + | |
| 904 | +if (odd) then | |
| 905 | + nl2=(nx-1)/2 | |
| 906 | +else | |
| 907 | + nl2=nx/2 | |
| 908 | +end if | |
| 909 | + | |
| 910 | +den=0.0 | |
| 911 | +do i=1,nl2 | |
| 912 | + den=den+2.0*rx**(i-1) | |
| 913 | +end do | |
| 914 | +if (odd) den=den+rx**(nl2) | |
| 915 | + | |
| 916 | +dx=wx*2.0/den | |
| 917 | + | |
| 918 | +!write(*,*)'xc=',xc | |
| 919 | +!write(*,*)'nx=',nx | |
| 920 | +!write(*,*)'odd=',odd | |
| 921 | +!write(*,*)'nl2=',nl2 | |
| 922 | +!write(*,*)'wx=',wx | |
| 923 | +!write(*,*)'den=',den | |
| 924 | +!write(*,*)'dx=',dx | |
| 925 | + | |
| 926 | +ox=wx | |
| 927 | +do i=1,nl2 | |
| 928 | + ox=ox-dx*(rx**(i-1)) | |
| 929 | +! write(*,*)'i=',i,' ox=',ox | |
| 930 | + CALL rotate(-ox,+wy,vxx,vxy,rotx,roty) | |
| 931 | + write(file_unit,*)xc+rotx,yc+roty | |
| 932 | + CALL rotate(-ox,-wy,vxx,vxy,rotx,roty) | |
| 933 | + write(file_unit,*)xc+rotx,yc+roty | |
| 934 | + write(file_unit,*) | |
| 935 | + CALL rotate(+ox,+wy,vxx,vxy,rotx,roty) | |
| 936 | + write(file_unit,*)xc+rotx,yc+roty | |
| 937 | + CALL rotate(+ox,-wy,vxx,vxy,rotx,roty) | |
| 938 | + write(file_unit,*)xc+rotx,yc+roty | |
| 939 | + write(file_unit,*) | |
| 940 | +end do | |
| 941 | + | |
| 942 | +if (.NOT.odd) then ! write centre line | |
| 943 | + CALL rotate(0d0,+wy,vxx,vxy,rotx,roty) | |
| 944 | + write(file_unit,*)xc+rotx,yc+roty | |
| 945 | + CALL rotate(0d0,-wy,vxx,vxy,rotx,roty) | |
| 946 | + write(file_unit,*)xc+rotx,yc+roty | |
| 947 | + write(file_unit,*) | |
| 948 | +end if | |
| 949 | + | |
| 950 | +! lines in the y direction | |
| 951 | +if ( mod(ny,2).EQ.0 ) then | |
| 952 | + odd=.FALSE. | |
| 953 | +else | |
| 954 | + odd=.TRUE. | |
| 955 | +end if | |
| 956 | + | |
| 957 | +if (odd) then | |
| 958 | + nl2=(ny-1)/2 | |
| 959 | +else | |
| 960 | + nl2=ny/2 | |
| 961 | +end if | |
| 962 | + | |
| 963 | +den=0.0 | |
| 964 | +do i=1,nl2 | |
| 965 | + den=den+2.0*ry**(i-1) | |
| 966 | +end do | |
| 967 | +if (odd) den=den+ry**(nl2) | |
| 968 | + | |
| 969 | +dy=wy*2.0/den | |
| 970 | + | |
| 971 | +oy=wy | |
| 972 | +do i=1,nl2 | |
| 973 | + oy=oy-dy*(ry**(i-1)) | |
| 974 | + write(file_unit,*)xc+wx,yc-oy | |
| 975 | + write(file_unit,*)xc-wx,yc-oy | |
| 976 | + write(file_unit,*) | |
| 977 | + write(file_unit,*)xc+wx,yc+oy | |
| 978 | + write(file_unit,*)xc-wx,yc+oy | |
| 979 | + write(file_unit,*) | |
| 980 | +end do | |
| 981 | + | |
| 982 | +if (.NOT.odd) then ! write centre line | |
| 983 | + write(file_unit,*)xc+wx,yc | |
| 984 | + write(file_unit,*)xc-wx,yc | |
| 985 | + write(file_unit,*) | |
| 986 | +end if | |
| 987 | + | |
| 988 | +RETURN | |
| 989 | + | |
| 990 | +END SUBROUTINE plot_grid | |
| 991 | +! | |
| 992 | +! _______________________________________________________ | |
| 993 | +! | |
| 994 | +! | |
| 995 | +SUBROUTINE rotate(x,y,vxx,vxy,rx,ry) | |
| 996 | + | |
| 997 | +USE type_specifications | |
| 998 | + | |
| 999 | +IMPLICIT NONE | |
| 1000 | + | |
| 1001 | +! variables passed to subroutine | |
| 1002 | + | |
| 1003 | +real(dp) :: x,y,vxx,vxy,rx,ry | |
| 1004 | + | |
| 1005 | +! local variables | |
| 1006 | + | |
| 1007 | +real(dp) :: vyx,vyy | |
| 1008 | + | |
| 1009 | +! START | |
| 1010 | + | |
| 1011 | +vyx=-vxy | |
| 1012 | +vyy=vxx | |
| 1013 | + | |
| 1014 | +rx=x*vxx+y*vyx | |
| 1015 | +ry=x*vxy+y*vyy | |
| 1016 | + | |
| 1017 | +RETURN | |
| 1018 | + | |
| 1019 | +END SUBROUTINE rotate | |
| 1020 | + | ... | ... |