Commit 7deb5e7338983d1488f1e7c02159a34465d167b3
1 parent
0cd31073
Exists in
nested_overshields
Initial updates to create_global_domain_structure.F90 for nested overshields
Showing
15 changed files
with
221 additions
and
31 deletions
Show diff stats
DOCUMENTATION/USER_GUIDE/Imgs/edge_coupled_stripline-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_bundle_form_01-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_bundle_form_01a-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_bundle_form_01b-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_bundle_form_02-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_bundle_form_02a-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_bundle_form_02b-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_cable_form_01-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_cable_form_02-eps-converted-to.pdf deleted
No preview for this file type
DOCUMENTATION/USER_GUIDE/Imgs/flex_cable_form_03-eps-converted-to.pdf deleted
No preview for this file type
SRC/BUNDLE_DOMAIN_CREATION/create_global_domain_structure.F90
... | ... | @@ -73,8 +73,10 @@ |
73 | 73 | ! so that we can work out the is_shield flag properly in all circumstances. |
74 | 74 | ! 18/10/2017 CJS: include 8b. Copy the cable based conductor labels to the bundle structure |
75 | 75 | ! 16/11/2017 CJS Include network synthesis process to replace s-domain transfer functions |
76 | -! 16/3/2018 CJS add y offset for ML_flex_cable | |
76 | +! 16/3/2018 CJS add y offset for ML_flex_cable | |
77 | 77 | ! 22/10/2019 CJS Fix bug with numbering here: overshields were numbered using terminal conductor number not global domain number |
78 | +! 24/10/2019 CJS Allow mutliple layers of overshields (previously overshields could not be 'nested' | |
79 | +! (though they could cover shielded cables). | |
78 | 80 | ! |
79 | 81 | |
80 | 82 | SUBROUTINE create_global_domain_structure(bundle) |
... | ... | @@ -97,7 +99,7 @@ USE maths |
97 | 99 | ! local variables |
98 | 100 | |
99 | 101 | ! global cable, conductor and domain numbers and loop variables |
100 | - integer :: cable | |
102 | + integer :: cable,cable_t | |
101 | 103 | integer :: tot_n_cables |
102 | 104 | integer :: tot_n_cables_without_ground_plane |
103 | 105 | |
... | ... | @@ -115,7 +117,9 @@ USE maths |
115 | 117 | integer :: first_external_conductor |
116 | 118 | |
117 | 119 | ! variables for looking at overshields and determining which domain cables are in |
118 | - integer :: tot_n_overshields,n_overshield_domains,overshield | |
120 | + integer :: tot_n_overshields,n_overshield_domains,overshield,reference_overshield | |
121 | + real(dp)::radius_reference_overshield | |
122 | + | |
119 | 123 | integer,allocatable :: overshield_shape(:) |
120 | 124 | real(dp),allocatable :: overshield_x(:) |
121 | 125 | real(dp),allocatable :: overshield_y(:) |
... | ... | @@ -125,11 +129,12 @@ USE maths |
125 | 129 | real(dp),allocatable :: overshield_h(:) |
126 | 130 | integer,allocatable :: overshield_domain(:) |
127 | 131 | integer,allocatable :: overshield_reference_terminal_conductor(:) |
132 | + integer,allocatable :: overshield_to_cable_number(:) | |
128 | 133 | |
129 | 134 | integer,allocatable :: overshield_n_conductors(:) |
130 | 135 | integer,allocatable :: overshield_terminal_conductor(:,:) |
131 | 136 | |
132 | - real(dp) :: cable_x,cable_y,dist_cable_to_overshield_centre | |
137 | + real(dp) :: cable_x,cable_y,dist_cable_to_overshield_centre,cable_r | |
133 | 138 | logical :: is_overshield_domain |
134 | 139 | |
135 | 140 | ! referencing arrays |
... | ... | @@ -160,7 +165,7 @@ USE maths |
160 | 165 | integer :: dim |
161 | 166 | integer :: row,col |
162 | 167 | integer :: row_l,col_l |
163 | - integer :: row_g,col_g | |
168 | + integer :: row_g,col_g,row_g_ref | |
164 | 169 | |
165 | 170 | character(LEN=3) :: conductor_string ! used to generate the conductor labels in the bundle |
166 | 171 | |
... | ... | @@ -291,12 +296,14 @@ USE maths |
291 | 296 | ALLOCATE( overshield_w2(1:tot_n_overshields) ) |
292 | 297 | ALLOCATE( overshield_h(1:tot_n_overshields) ) |
293 | 298 | ALLOCATE( overshield_reference_terminal_conductor(1:tot_n_overshields) ) |
299 | + ALLOCATE( overshield_to_cable_number(1:tot_n_overshields) ) | |
294 | 300 | |
295 | 301 | overshield=0 |
296 | 302 | conductor_count=0 |
297 | 303 | do cable=1,tot_n_cables |
298 | 304 | if (bundle%cable(cable)%cable_type.EQ.cable_geometry_type_overshield) then |
299 | 305 | overshield=overshield+1 |
306 | + overshield_to_cable_number(overshield)=cable | |
300 | 307 | overshield_shape(overshield)=circle |
301 | 308 | overshield_x(overshield)=bundle%cable_x_offset(cable) |
302 | 309 | overshield_y(overshield)=bundle%cable_y_offset(cable) |
... | ... | @@ -305,6 +312,20 @@ USE maths |
305 | 312 | overshield_w2(overshield)=0d0 |
306 | 313 | overshield_h(overshield)=0d0 |
307 | 314 | overshield_reference_terminal_conductor(overshield)=conductor_count+1 |
315 | + | |
316 | + else | |
317 | + | |
318 | +! This is not an overshield | |
319 | + | |
320 | + if ( (bundle%cable(cable)%cable_type.NE.cable_geometry_type_ground_plane) .AND. (overshield.NE.0) ) then | |
321 | + | |
322 | +! check that oveshields are the last conductors defined in the bundle_spec file | |
323 | + run_status='ERROR, Overshields should be the last cables defined in the bundle specification' | |
324 | + CALL write_program_status() | |
325 | + STOP 1 | |
326 | + | |
327 | + end if | |
328 | + | |
308 | 329 | end if |
309 | 330 | conductor_count=conductor_count+bundle%cable(cable)%tot_n_conductors |
310 | 331 | end do |
... | ... | @@ -330,47 +351,175 @@ USE maths |
330 | 351 | cable_reference_conductor(1:bundle%n_cables)=0 |
331 | 352 | n_overshield_domains=0 ! counter for overshield domains |
332 | 353 | |
354 | + write(*,*)'**********************************************************************' | |
355 | + | |
333 | 356 | do cable=1,tot_n_cables |
334 | 357 | |
358 | + write(*,*) | |
359 | + write(*,*)'Checking cable number',cable | |
360 | + | |
335 | 361 | if (bundle%cable(cable)%cable_type.NE.cable_geometry_type_overshield) then |
336 | -! if this cable is not an overshield then see whether it is WITHIN an overshield | |
362 | + | |
363 | +! IF THIS CABLE IS NOT AN OVERSHIELD THEN SEE WHETHER IT IS WITHIN AN OVERSHIELD | |
364 | + | |
365 | + write(*,*)'THIS CABLE IS NOT AN OVERSHIELD' | |
337 | 366 | |
338 | 367 | cable_x=bundle%cable_x_offset(cable) |
339 | 368 | cable_y=bundle%cable_y_offset(cable) |
369 | + | |
370 | +! find the smallest overshield enclosing this cable | |
371 | + | |
372 | + reference_overshield=0 | |
373 | + radius_reference_overshield=1d30 | |
340 | 374 | |
341 | 375 | do overshield=1,tot_n_overshields |
342 | - | |
376 | + | |
343 | 377 | dist_cable_to_overshield_centre=sqrt( (cable_x-overshield_x(overshield))**2+ & |
344 | - (cable_y-overshield_y(overshield))**2 ) | |
378 | + (cable_y-overshield_y(overshield))**2 ) | |
379 | + | |
345 | 380 | if ( dist_cable_to_overshield_centre.LT.overshield_r(overshield) ) then |
346 | -! we conclude that this cable is with the overshield | |
381 | +! we conclude that this cable is within the overshield | |
382 | + | |
383 | + write(*,*)'This cable is inside overshield number',overshield | |
347 | 384 | |
348 | - if (overshield_domain(overshield).EQ.0) then | |
385 | + if (radius_reference_overshield.GT.overshield_r(overshield)) then | |
386 | +! this overshield is smaller than the current reference overshield so this becomes the new reference overshield | |
387 | + | |
388 | + reference_overshield=overshield | |
389 | + radius_reference_overshield=overshield_r(overshield) | |
390 | + | |
391 | + write(*,*)'This cable reference overshield has been updated to',reference_overshield | |
392 | + | |
393 | + end if ! is this the smallest overshield? | |
394 | + | |
395 | + end if ! is cable within this overshield? | |
396 | + | |
397 | + end do | |
398 | + | |
399 | + if (reference_overshield.NE.0) then | |
400 | +! this cable has been identified as being within an overshield | |
401 | + | |
402 | + if (overshield_domain(reference_overshield).EQ.0) then | |
349 | 403 | |
350 | 404 | ! this overshield domain is unallocated so create a new domain |
351 | 405 | |
352 | - tot_n_domains=tot_n_domains+1 | |
353 | - n_overshield_domains=n_overshield_domains+1 | |
354 | - if(verbose) write(*,*)'Creating overshield domain=',tot_n_domains | |
355 | - overshield_domain(overshield)=tot_n_domains | |
406 | + tot_n_domains=tot_n_domains+1 | |
407 | + n_overshield_domains=n_overshield_domains+1 | |
408 | + if(verbose) write(*,*)'Creating overshield domain=',tot_n_domains | |
409 | + overshield_domain(reference_overshield)=tot_n_domains | |
410 | + | |
411 | + global_domain_reference_conductor(tot_n_domains)=overshield_reference_terminal_conductor(reference_overshield) | |
356 | 412 | |
357 | - global_domain_reference_conductor(tot_n_domains)=overshield_reference_terminal_conductor(overshield) | |
413 | + write(*,*)'This overshield domain is unallocated so create a new domain, domain=',tot_n_domains | |
358 | 414 | |
359 | - end if ! this overshield domain is unallocated | |
415 | + end if ! this overshield domain is unallocated | |
416 | + | |
417 | + cable_reference_domain(cable)=overshield_domain(reference_overshield) | |
360 | 418 | |
361 | - cable_reference_domain(cable)=overshield_domain(overshield) | |
419 | + write(*,*)'Setting the cable reference domain to',overshield_domain(reference_overshield) | |
362 | 420 | |
363 | - end if ! this cable is with the overshield | |
421 | + end if ! this cable is within the overshield | |
422 | + | |
423 | + terminal_conductor=terminal_conductor+bundle%cable(cable)%tot_n_conductors ! update the terminal conductor count | |
364 | 424 | |
365 | - end do ! next overshield to check | |
425 | + else ! THIS CABLE IS AN OVERSHIELD SO WE NEED TO CHECK WHETHER IT IS INSIDE ANY OTHER OVERSHIELDS | |
426 | + | |
427 | + write(*,*)'THIS CABLE IS AN OVERSHIELD' | |
428 | + | |
429 | + cable_x=bundle%cable_x_offset(cable) | |
430 | + cable_y=bundle%cable_y_offset(cable) | |
431 | + cable_r=bundle%cable(cable)%parameters(1) ! overshield radius | |
366 | 432 | |
367 | - terminal_conductor=terminal_conductor+bundle%cable(cable)%tot_n_conductors ! update the terminal conductor count | |
433 | +! find the smallest overshield enclosing this overshield if there is one | |
434 | + | |
435 | + reference_overshield=0 | |
436 | + radius_reference_overshield=1d30 | |
437 | + | |
438 | + do overshield=1,tot_n_overshields | |
439 | + | |
440 | + cable_t=overshield_to_cable_number(overshield) | |
441 | + if (cable_t.NE.cable) then ! don't check an overshield against itself | |
442 | + | |
443 | + dist_cable_to_overshield_centre=sqrt( (cable_x-overshield_x(overshield))**2+ & | |
444 | + (cable_y-overshield_y(overshield))**2 ) | |
445 | + | |
446 | + if ( dist_cable_to_overshield_centre.LT.overshield_r(overshield) ) then | |
447 | +! we conclude that this cable is within the overshield | |
448 | + | |
449 | + write(*,*)'This overshield centre is inside overshield number',overshield | |
450 | + | |
451 | +!! Check that can be removed when we are happy with nexted overshields code | |
452 | +! run_status='ERROR, Nested overshields cannot be used in SACAMOS at the moment' | |
453 | +! CALL write_program_status() | |
454 | +! STOP 1 | |
455 | + | |
456 | + if (radius_reference_overshield.GT.overshield_r(overshield)) then | |
457 | +! this overshield is smaller than the current reference overshield so this becomes the new reference overshield | |
458 | + | |
459 | + if (overshield_r(overshield).GT.cable_r) then | |
460 | +! the cable is smaller than the overshield and hence is inside it | |
461 | + | |
462 | +! Check that the lowest number overshield is the smaller. Overshields should be numbered inside to out | |
463 | + | |
464 | + if (cable_t.LT.cable) then | |
465 | + | |
466 | + run_status='ERROR, Nested overshields should be numbered in the order inside to out' | |
467 | + CALL write_program_status() | |
468 | + STOP 1 | |
469 | + | |
470 | + end if | |
471 | + | |
472 | + write(*,*)'This overshield is smaller than the reference overshield and is therefore inside it' | |
473 | + | |
474 | + reference_overshield=overshield | |
475 | + radius_reference_overshield=overshield_r(overshield) | |
476 | + | |
477 | + write(*,*)'This cable reference overshield has been updated to',reference_overshield | |
478 | + | |
479 | + end if ! This overshield is smaller than the reference overshield and is therefore inside it | |
480 | + | |
481 | + end if ! is this the smallest overshield? | |
482 | + | |
483 | + end if ! is cable centre within this overshield? | |
484 | + | |
485 | + end if ! don't check an overshield against itself | |
486 | + | |
487 | + end do | |
368 | 488 | |
489 | + if (reference_overshield.NE.0) then | |
490 | +! this cable has been identified as being within an overshield | |
491 | + | |
492 | + if (overshield_domain(reference_overshield).EQ.0) then | |
493 | + | |
494 | +! this overshield domain is unallocated so create a new domain | |
495 | + | |
496 | + tot_n_domains=tot_n_domains+1 | |
497 | + n_overshield_domains=n_overshield_domains+1 | |
498 | + if(verbose) write(*,*)'Creating overshield domain=',tot_n_domains | |
499 | + overshield_domain(reference_overshield)=tot_n_domains | |
500 | + | |
501 | + global_domain_reference_conductor(tot_n_domains)=overshield_reference_terminal_conductor(reference_overshield) | |
502 | + | |
503 | + write(*,*)'This overshield domain is unallocated so create a new domain, domain=',tot_n_domains | |
504 | + | |
505 | + end if ! this overshield domain is unallocated | |
506 | + | |
507 | + cable_reference_domain(cable)=overshield_domain(reference_overshield) | |
508 | + | |
509 | + write(*,*)'Setting the cable reference domain to',overshield_domain(reference_overshield) | |
510 | + | |
511 | + end if ! this cable is within the overshield | |
512 | + | |
513 | + terminal_conductor=terminal_conductor+bundle%cable(cable)%tot_n_conductors ! update the terminal conductor count | |
514 | + | |
515 | + | |
369 | 516 | end if ! not an overshield |
370 | 517 | |
371 | 518 | end do ! next cable |
372 | 519 | |
373 | 520 | if (verbose) write(*,*) 'n_overshield_domains=',n_overshield_domains |
521 | + | |
522 | + write(*,*)'**********************************************************************' | |
374 | 523 | |
375 | 524 | ! 3c part 2. loop over the overshield domains and count the number of external conductors in each one |
376 | 525 | |
... | ... | @@ -736,6 +885,7 @@ USE maths |
736 | 885 | end do ! next local domain |
737 | 886 | |
738 | 887 | end do ! next cable |
888 | + | |
739 | 889 | |
740 | 890 | ! 6. Now that we have counted the number of domains we can allocate the |
741 | 891 | ! domain based number of conductors and L and C matrices plus |
... | ... | @@ -854,6 +1004,12 @@ USE maths |
854 | 1004 | terminal_conductor=0 ! this is the external conductor number |
855 | 1005 | domain_count=0 |
856 | 1006 | |
1007 | + if (verbose) then | |
1008 | + write(*,*)'' | |
1009 | + write(*,*)'SET MI, MV matrices' | |
1010 | + write(*,*)'' | |
1011 | + end if | |
1012 | + | |
857 | 1013 | do cable=1,tot_n_cables_without_ground_plane |
858 | 1014 | |
859 | 1015 | local_n_domains=bundle%cable(cable)%tot_n_domains |
... | ... | @@ -864,6 +1020,7 @@ USE maths |
864 | 1020 | ! copy the cable based MI and MV matrices to the global structure. The cable based |
865 | 1021 | ! MI and MV matrices are on the basis of terminal_conductor numbering |
866 | 1022 | if (verbose) then |
1023 | + write(*,*)'' | |
867 | 1024 | write(*,*)'Copy MI, MV, cable=',cable,' of', tot_n_cables_without_ground_plane |
868 | 1025 | write(*,*)'Matrix dimension',n_cable_conductors+1 |
869 | 1026 | write(*,*)'intial terminal_conductor count=',terminal_conductor |
... | ... | @@ -880,7 +1037,7 @@ USE maths |
880 | 1037 | else |
881 | 1038 | row_g=terminal_conductor_to_reference_global_domain_conductor(terminal_conductor+row_l-1) ! last conductor for this cable and the reference |
882 | 1039 | end if |
883 | - | |
1040 | + | |
884 | 1041 | if (col_l.NE.n_cable_conductors+1) then |
885 | 1042 | col_g=terminal_conductor+col_l |
886 | 1043 | else |
... | ... | @@ -890,12 +1047,44 @@ USE maths |
890 | 1047 | bundle%global_MI%mat(row_g,col_g)=bundle%cable(cable)%MI%mat(row_l,col_l) |
891 | 1048 | bundle%global_MV%mat(row_g,col_g)=bundle%cable(cable)%MV%mat(row_l,col_l) |
892 | 1049 | |
893 | - if (verbose) write(*,*)'Copy MV element',row_g,col_g,bundle%global_MV%mat(row_g,col_g) | |
1050 | +! if (verbose) write(*,*)'Copy MV element',row_g,col_g,bundle%global_MV%mat(row_g,col_g) | |
894 | 1051 | |
1052 | + if (verbose) then | |
1053 | + write(*,*)'Copy MI element',' row_g=',row_g,' col_g=',col_g, & | |
1054 | + ' row_l=',row_l,' col_l=',col_l,bundle%cable(cable)%MI%mat(row_l,col_l) | |
1055 | + end if | |
1056 | + | |
895 | 1057 | end do ! next col |
896 | 1058 | |
897 | 1059 | end do ! next row |
898 | 1060 | |
1061 | + if (bundle%cable(cable)%cable_type.EQ.cable_geometry_type_overshield) then | |
1062 | +! This is an overshield so invoke the special process for overshields | |
1063 | + | |
1064 | +! Get the global domain number of the shield conductor | |
1065 | + row_g=terminal_conductor_to_global_domain_conductor(terminal_conductor+1) | |
1066 | + | |
1067 | +! Get the global domain number of the shield reference conductor | |
1068 | + row_g_ref=terminal_conductor_to_reference_global_domain_conductor(terminal_conductor+1) | |
1069 | + | |
1070 | +! Add all the non-zero elements of the MI matrix shield row to the shield reference row | |
1071 | + | |
1072 | + write(*,*)'Overshield cable',cable,' Copying row',row_g,' to row',row_g_ref | |
1073 | + | |
1074 | + do col_g=1,bundle%global_MI%dim | |
1075 | + | |
1076 | +! In the global MI, MV structure rows correspond to the global domain conductor number, cols correspond to the terminal conductor number | |
1077 | + | |
1078 | + if (bundle%global_MI%mat(row_g,col_g).NE.0d0) then | |
1079 | + | |
1080 | + bundle%global_MI%mat(row_g_ref,col_g)=bundle%global_MI%mat(row_g,col_g) | |
1081 | + | |
1082 | + end if | |
1083 | + | |
1084 | + end do ! next col | |
1085 | + | |
1086 | + end if ! overshield | |
1087 | + | |
899 | 1088 | do local_domain=1,local_n_domains ! exclude the external domain for now |
900 | 1089 | |
901 | 1090 | if (local_domain.NE.local_n_domains) then |
... | ... | @@ -1363,6 +1552,7 @@ write(*,*)'****************************************************************' |
1363 | 1552 | if (allocated( overshield_h )) DEALLOCATE( overshield_h) |
1364 | 1553 | if (allocated( overshield_domain )) DEALLOCATE( overshield_domain) |
1365 | 1554 | if (allocated( overshield_reference_terminal_conductor)) DEALLOCATE( overshield_reference_terminal_conductor ) |
1555 | + if (allocated( overshield_to_cable_number)) DEALLOCATE( overshield_to_cable_number ) | |
1366 | 1556 | if (allocated( global_domain_reference_conductor )) DEALLOCATE( global_domain_reference_conductor ) |
1367 | 1557 | DEALLOCATE( cable_reference_conductor ) |
1368 | 1558 | DEALLOCATE( cable_reference_domain ) | ... | ... |
TEST_CASES/OVERSHIELD_COAX_FREE_SPACE_OVER_GROUND_PLANE/coax_over_ground_plane.bundle_spec
... | ... | @@ -3,9 +3,9 @@ |
3 | 3 | #MOD_bundle_lib_dir |
4 | 4 | ./ |
5 | 5 | 2 # Number of cables in bundle, cable list follows: name then x,y of cable |
6 | -overshield | |
7 | -0.0 0.01 ! x and y coordinates of the cable centre | |
8 | 6 | inner_wire |
9 | 7 | 0.0 0.01 ! x and y coordinates of the cable centre |
8 | +overshield | |
9 | +0.0 0.01 ! x and y coordinates of the cable centre | |
10 | 10 | ground_plane |
11 | 11 | ... | ... |
TEST_CASES/OVERSHIELD_COAX_FREE_SPACE_OVER_GROUND_PLANE/coax_over_ground_plane_ac.spice_model_spec
... | ... | @@ -15,23 +15,23 @@ coax_over_ground_plane |
15 | 15 | 90.0 0.0 ktheta kphi (degrees) |
16 | 16 | -1.0 0.0 Etheta Ephi |
17 | 17 | # End 1 termination model |
18 | -1.0 End 1 voltage source list | |
18 | +0.0 End 1 voltage source list | |
19 | +1.0 | |
19 | 20 | 0.0 |
20 | -0.0 | |
21 | -10.0 End 1 impedance list | |
22 | -100.0 | |
21 | +100.0 End 1 impedance list | |
22 | +10.0 | |
23 | 23 | 0.0 |
24 | 24 | # End 2 termination model |
25 | 25 | 0.0 End 2 voltage source list |
26 | 26 | 0.0 |
27 | 27 | 0.0 |
28 | -20.0 End 2 impedance list | |
29 | -25.0 | |
28 | +25.0 End 2 impedance list | |
29 | +20.0 | |
30 | 30 | 0.0 |
31 | 31 | # Type of analysis |
32 | 32 | AC |
33 | 33 | log # frequency scale (log or lin) |
34 | 34 | 1e3 1e8 1000 # fmin fmax number_of_frequencies |
35 | 35 | # Output conductor number and end number |
36 | -1 1 | |
36 | +2 1 | |
37 | 37 | lin # output type (lin or dB) | ... | ... |