
// Note : this file contains the definition of the problem geometry.
// To run this example you need to open the .pro file with GetDP.

// ----------------------------------------------------------------- //
//                ____           __          __                      //
//               /  _/___  _____/ /_  ______/ /__  _____             //
//               / // __ \/ ___/ / / / / __  / _ \/ ___/             //
//             _/ // / / / /__/ / /_/ / /_/ /  __(__  )              //
//            /___/_/ /_/\___/_/\__,_/\__,_/\___/____/               //
//                                                                   //
// ----------------------------------------------------------------- //

Include "2D_eucard_parameters_v3.geo" ; // Include parameters
Include "2D_eucard_macros_v3.geo" ; // Include user-defined macros

// ----------------------------------------------------------------- //
//            ______                          __                     //
//           / ____/__  ____  ____ ___  ___  / /________  __         //
//          / / __/ _ \/ __ \/ __ `__ \/ _ \/ __/ ___/ / / /         //
//         / /_/ /  __/ /_/ / / / / / /  __/ /_/ /  / /_/ /          //
//         \____/\___/\____/_/ /_/ /_/\___/\__/_/   \__, /           //
//                                                 /____/            //
//                                                                   //
// ----------------------------------------------------------------- //

// Define the geometry the strands of superconductors -------------- //

Call MakeCoil ;

// Make the air bounding box --------------------------------------- //

pa = newp ;
Point( pa   )  = { 0.           ,  0.           , 0. , AirMeshSize } ;
Point( pa+1 )  = { 0.           , -AirIntRadius , 0. , AirMeshSize } ;
Point( pa+2 )  = { AirIntRadius ,  0.           , 0. , AirMeshSize } ;
Point( pa+3 )  = { 0.           ,  AirIntRadius , 0. , AirMeshSize } ;
la = newl ;
Circle( la   ) = { pa+1 , pa   , pa+2 } ;
Circle( la+1 ) = { pa+2 , pa   , pa+3 } ;
Line( la+2 )   = { pa+3 , pa+1 } ;
lla = newll ;
Line Loop( lla ) = { la:la+2 } ;
sa = news ;
Plane Surface( sa ) = { lla , llSupra[] } ;
Line { lMeshC[] } In Surface { sa } ;

// Make the pseudo-infinite air domain ----------------------------- //

pi = newp ;
Point( pi   )  = { 0.           , -AirExtRadius , 0. , AirMeshSize } ;
Point( pi+1 )  = { AirExtRadius ,  0.           , 0. , AirMeshSize } ;
Point( pi+2 )  = { 0.           ,  AirExtRadius , 0. , AirMeshSize } ;
li = newl ;
Line( li   )   = { pa+1 , pi   } ;
Circle( li+1 ) = { pi   , pa   , pi+1 } ;
Circle( li+2 ) = { pi+1 , pa   , pi+2 } ;
Line( li+3 )   = { pi+2 , pa+3 } ;
lli = newll ;
Line Loop( lli ) = { li:li+3 , -(la+1) , -la } ;
si = news ;
Plane Surface( si ) = { lli } ;

// ----------------------------------------------------------------- //
//                      _______      __    __                        //
//                     / ____(_)__  / /___/ /____                    //
//                    / /_  / / _ \/ / __  / ___/                    //
//                   / __/ / /  __/ / /_/ (__  )                     //
//                  /_/   /_/\___/_/\__,_/____/                      //
//                                                                   //
// ----------------------------------------------------------------- //

// Fields can be defined here to set up the local mesh density

// ----------------------------------------------------------------- // 
//                       ______                                      //
//                      /_  __/___  ____  _____                      //
//                       / / / __ `/ __ `/ ___/                      //
//                      / / / /_/ / /_/ (__  )                       //
//                     /_/  \__,_/\__, /____/                        //
//                               /____/                              //
//                                                                   //
// ----------------------------------------------------------------- //

// Physical tags are associated with the elementary geometry ------- //

Physical Surface( PhysSupra ) = { sSupra[] } ;
For iTurn In { 1:(2*NbTurns) }
  Physical Surface( PhysSupra + iTurn ) = { sSupra[ iTurn - 1 ] } ;
EndFor
Physical Surface( PhysAir   ) = { sa       } ;
Physical Surface( PhysInf   ) = { si       } ;
Physical Line( PhysCondSkin ) = { lSupra[] } ;

// ----------------------------------------------------------------- //
//     ______      __                          __                    //
//    / ____/___  / /_  ____  ____ ___  ____  / /___  ____  __  __   //
//   / /   / __ \/ __ \/ __ \/ __ `__ \/ __ \/ / __ \/ __ `/ / / /   //
//  / /___/ /_/ / / / / /_/ / / / / / / /_/ / / /_/ / /_/ / /_/ /    //
//  \____/\____/_/ /_/\____/_/ /_/ /_/\____/_/\____/\__, /\__, /     //
//                                                 /____//____/      //
//                                                                   //
// ----------------------------------------------------------------- //

// Compute cuts in the air domain ---------------------------------- //

For iTurn In { 1:(2*NbTurns) }
  CondsToFill[] = {} ;
  If ( iTurn > 1 ) 
    CondsToFill[] += { PhysSupra+1:PhysSupra+iTurn-1 } ;
  EndIf
  If ( iTurn < ( 2*NbTurns ) )
    CondsToFill[] += { PhysSupra+iTurn+1:PhysSupra+2*NbTurns } ;
  EndIf
  Cohomology(1) { { PhysAir , PhysInf , CondsToFill[] } , {} } ;
EndFor

// ----------------------------------------------------------------- //
//                  ____        __  _                                //   
//                 / __ \____  / /_(_)___  ____  _____               //
//                / / / / __ \/ __/ / __ \/ __ \/ ___/               //
//               / /_/ / /_/ / /_/ / /_/ / / / (__  )                //
//               \____/ .___/\__/_/\____/_/ /_/____/                 //
//                   /_/                                             //
//                                                                   //
// ----------------------------------------------------------------- //

Include "2D_eucard_display_v3.geo" ; // Include the custom display options
