* @POLO PROCEDUR CB215821 15/12/02 21:15:02 8719 *------------------------------------------------- ****** PROCEDURE @POLO ****** *------------------------------------------------- * * * CETTE PROCEDURE A ETE MISE GRACIEUSEMENT * A DISPOSOTION DE LA COMMUNAUTE CASTEM2000 * PAR M. LIBEYRE ( CEA/DSM/DRFC ) * * TEL : ( 33 1 ) 42 25 46 03 * *------------------------------------------------- * * CALCUL D'UN CHAMP MAGNETIQUE POLOIDAL * *-------------------------------------------------------- **************************************************************** * * * @ P O L O * * --------- * * * * Objet : * * * * Calcul d'un champ magnetique poloidal genere par un ensemble * * de bobines. * * * * Syntaxe : * * * * TABCHB TAB2 = @POLO TAGEO1 TABOB1 ( PL1 ) ; * * * * En entree : * * * * TAGEO1 table contenant (type TABLE) * * i objet geometrique ou l'on veut calculer le * * champ magnetique (type MAILLAGE) * * * * TABOB1 table a deux indices contenant les donnees * * relatives aux bobines (type TABLE) * * - 1er indice : * * i numero de la bobine (type ENTIER) * * - 2eme indice (pour chaque bobine) : * * COUL couleur de la bobine (voir palette dans COUL) * * RI rayon interne (type FLOTTANT) * * RE rayon externe (type FLOTTANT) * * H hauteur de la section (type FLOTTANT) * * C centre de la section (type POINT) * * V vecteur normal a la section (type POINT) * * SOL solenation : courant global dans la bobine = * * courant * nombre de spires (type FLOTTANT) * * + options facultatives (en 1er indice) : * * TRAC1 si existe : trace du maillage des bobines * * TRAC2 si existe : trace du contour des bobines dans * * les plans de coupe * * * * PL1 table a deux indices contenant la definition * * des plans de coupe (facultative / type TABLE) * * - 1er indice : * * i numero du plan (type ENTIER) * * - 2eme indice (deux possibilites) : * * 1/ pour definir chaque plan : * * PP point quelconque du plan (type POINT) * * VP vecteur normal (type POINT) * * 2/ pour reprendre un contour deja calcule : * * MAIL contour des bobines dans un plan de coupe * * (type MAILLAGE) * * * * En sortie : * * * * TABCHB table contenant (type TABLE) * * i champ de Biot et Savart relatif au i-eme * * maillage GEO1 (type CHPOINT) * * * * TAB2 table contenant (type TABLE) * * BOBMAI.i maillage de chaque bobine i (type MAILLAGE) * * LIG.j ensemble des coupes sur le plan j * * (type MAILLAGE) * * CHBLIG.j champ magnetique relatif au maillage LIG.j * * (type CHPOINT) * * * * Remarques : * * * * Les grandeurs suivantes sont "en dur" dans la procedure : * * * * NELE nombre d'elements generes lors des rotations * * effectuees pendant la creation du maillage des * * bobines * * COEF1 coefficient etablissant la distance critique * * de selection des points lors de la recherche * * de contour * * * **************************************************************** * * Valeurs de quelques constantes * MU0 = 4.E-7 * PI ; EPS = 1.E-3 ; IERR = 0 ; NELE = 8 ; ALPHA = 90. ; * IGRAPH1 = FAUX ; 'SI' ( 'EXISTE' TABOB1 'TRAC1' ) ; IGRAPH1 = VRAI ; 'FINSI' ; IGRAPH2 = FAUX ; 'SI' ( 'EXISTE' TABOB1 'TRAC2' ) ; IGRAPH2 = VRAI ; 'FINSI' ; IDBG2 = FAUX ; 'SI' ( 'EXISTE' TABOB1 'DEBUG2' ) ; IDBG2 = VRAI ; 'FINSI' ; IAX = VRAI ; * 'SAUTER' 1 'LIGNE' ; 'SAUTER' 1 'LIGNE' ; 'REPETER' PROC 1 ; * * Etape 1 : creation du maillage de chaque bobine * 'SAUTER' 1 'LIGNE' ; TAB2 = 'TABLE' ; TABMAI = 'TABLE' ; TABTRAV1 = 'TABLE' ; TABTRAV2 = 'TABLE' ; TABTRAV3 = 'TABLE' ; TABTRAV4 = 'TABLE' ; TABTRAV5 = 'TABLE' ; TABTRAV6 = 'TABLE' ; TABTRAV7 = 'TABLE' ; TAB2.BOBMAI = TABMAI ; REMAX = 0. ; IBOB = 1 ; CBB1 = 0. ; CBB2 = 0. ; CBB3 = 0. ; 'REPETER' BOUCBOB ; 'SI' ( 'EXISTE' TABOB1 IBOB ) ; * * Infos concernant la bobine IBOB (+ verifications) * 'MESS' 'Lecture des infos concernant la bobine ' IBOB ; BOB1 = TABOB1.IBOB ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; 'SI' ( 'EXISTE' BOB1 'RI' ) ; RI*'FLOTTANT' = BOB1.'RI' ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'Erreur : il manque RI pour la bobine ' IBOB ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; 'SI' ( 'EXISTE' BOB1 'RE' ) ; RE*'FLOTTANT' = BOB1.'RE' ; 'SI' ( RE > REMAX ) ; REMAX = RE ; 'FINSI' ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'Erreur : il manque RE pour la bobine ' IBOB ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; 'SI' ( 'EXISTE' BOB1 'H' ) ; H*'FLOTTANT' = BOB1.'H' ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'Erreur : il manque H pour la bobine ' IBOB ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; 'SI' ( 'EXISTE' BOB1 'C' ) ; C*'POINT' = BOB1.'C' ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'Erreur : il manque C pour la bobine ' IBOB ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; 'SI' ( 'EXISTE' BOB1 'V' ) ; V*'POINT' = BOB1.'V' ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'Erreur : il manque V pour la bobine ' IBOB ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; 'SI' ( 'EXISTE' BOB1 'SOL' ) ; SOL*'FLOTTANT' = BOB1.'SOL' ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'Erreur : il manque SOL pour la bobine ' IBOB ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; C1 C2 C3 = 'COORD' C ; CBB1 = CBB1 + C1 ; CBB2 = CBB2 + C2 ; CBB3 = CBB3 + C3 ; V1 V2 V3 = 'COORD' V ; * * Vecteur WN tq : V1 WN1 + V2 WN2 + V3 WN3 = 0 * VN = ( (V1**2) + (V2**2) + (V3**2) ) ** 0.5 ; 'SI' ( VN 'EGA' 0. ) ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'ERREUR : bobine ' IBOB ' le vecteur V est nul' ; IERR = 1 ; 'QUITTER' PROC ; 'SAUTER' 1 'LIGNE' ; 'FINSI' ; VN1 = V1 / VN ; VN2 = V2 / VN ; VN3 = V3 / VN ; 'SI' ( VN1 'NEG' 0. ) ; 'SI' ( VN2 'NEG' 0. ) ; 'SI' ( VN3 'NEG' 0. ) ; W2 = VN3 / VN2 ; W3 = -1 ; WN = ( (W2**2) + (W3**2) ) ** 0.5 ; WN1 = 0. ; WN2 = W2 / WN ; WN3 = W3 / WN ; 'SINON' ; WN1 = 0. ; WN2 = 0. ; WN3 = 1. ; 'FINSI' ; 'SINON' ; 'SI' ( VN3 'NEG' 0. ) ; WN1 = 0. ; WN2 = 1. ; WN3 = 0. ; 'SINON' ; WN1 = 0. ; WN2 = 0. ; WN3 = 1. ; 'FINSI' ; 'FINSI' ; 'SINON' ; WN1 = 1. ; WN2 = 0. ; WN3 = 0. ; 'FINSI' ; VNOR = VN1 VN2 VN3 ; * * Construction des points P1 P2 P3 et P4 * P11 = C1 + (RI * WN1) - ((H / 2.) * VN1) ; P12 = C2 + (RI * WN2) - ((H / 2.) * VN2) ; P13 = C3 + (RI * WN3) - ((H / 2.) * VN3) ; P21 = C1 + (RE * WN1) - ((H / 2.) * VN1) ; P22 = C2 + (RE * WN2) - ((H / 2.) * VN2) ; P23 = C3 + (RE * WN3) - ((H / 2.) * VN3) ; P31 = C1 + (RE * WN1) + ((H / 2.) * VN1) ; P32 = C2 + (RE * WN2) + ((H / 2.) * VN2) ; P33 = C3 + (RE * WN3) + ((H / 2.) * VN3) ; P41 = C1 + (RI * WN1) + ((H / 2.) * VN1) ; P42 = C2 + (RI * WN2) + ((H / 2.) * VN2) ; P43 = C3 + (RI * WN3) + ((H / 2.) * VN3) ; P1 = P11 P12 P13 ; P2 = P21 P22 P23 ; P3 = P31 P32 P33 ; P4 = P41 P42 P43 ; PP11 = (P11 + P41) / 2. ; PP12 = (P12 + P42) / 2. ; PP13 = (P13 + P43) / 2. ; PP1 = PP11 PP12 PP13 ; TABTRAV6.IBOB = PP1 ; * * Les droites D1 D2 D3 et D4 generent des surfaces par * rotation autour de l'axe C/VN * CVN = (C1 + VN1) (C2 + VN2) (C3 + VN3) ; D1 = 'DROITE' 1 P1 P2 ; D2 = 'DROITE' 1 P2 P3 ; D3 = 'DROITE' 1 P3 P4 ; D4 = 'DROITE' 1 P4 P1 ; SURF1 = D1 'ROTATION' NELE ALPHA C CVN ; SURF2 = D2 'ROTATION' NELE ALPHA C CVN ; SURF3 = D3 'ROTATION' NELE ALPHA C CVN ; SURF4 = D4 'ROTATION' NELE ALPHA C CVN ; DCVN = 'DROITE' 1 C CVN ; SURFBO1 = SURF1 'ET' SURF2 'ET' SURF3 'ET' SURF4 ; XN1 = (VN2 * WN3) - (VN3 * WN2) ; XN2 = (VN3 * WN1) - (VN1 * WN3) ; XN3 = (VN1 * WN2) - (VN2 * WN1) ; P51 = C1 + (RI * XN1) - ((H / 2.) * VN1) ; P52 = C2 + (RI * XN2) - ((H / 2.) * VN2) ; P53 = C3 + (RI * XN3) - ((H / 2.) * VN3) ; P61 = C1 + (RE * XN1) + ((H / 2.) * VN1) ; P62 = C2 + (RE * XN2) + ((H / 2.) * VN2) ; P63 = C3 + (RE * XN3) + ((H / 2.) * VN3) ; P5 = P51 P52 P53 ; P6 = P61 P62 P63 ; PP21 = (P51 + P61) / 2. ; PP22 = (P52 + P62) / 2. ; PP23 = (P53 + P63) / 2. ; PP2 = PP21 PP22 PP23 ; TABTRAV7.IBOB = PP2 ; SURFBOB = SURFBO1 'ET' SURFBO2 'ET' SURFBO3 'ET' SURFBO4 ; 'ELIM' EPS SURFBOB ; 'SI' ( IBOB 'EGA' 1 ) ; GEO1 = BO1 ; 'FINSI' ; 'SI' ( IBOB 'EGA' 2 ) ; GEO1 = BO1 'ET' BO2 ; 'FINSI' ; 'SI' ( IBOB 'EGA' 3 ) ; GEO1 = GEO1 'ET' BO3 ; 'FINSI' ; 'SI' ( IBOB 'EGA' 4 ) ; GEO1 = GEO1 'ET' BO4 ; 'FINSI' ; 'SI' ( IBOB 'EGA' 5 ) ; GEO1 = GEO1 'ET' BO5 ; 'FINSI' ; 'SI' ( IBOB 'EGA' 6 ) ; GEO1 = GEO1 'ET' BO6 ; 'FINSI' ; 'SI' ( IBOB 'EGA' 7 ) ; GEO1 = GEO1 'ET' BO7 ; 'FINSI' ; 'SI' ( IBOB 'EGA' 8 ) ; GEO1 = GEO1 'ET' BO8 ; 'FINSI' ; 'SI' ( IBOB 'EGA' 9 ) ; GEO1 = GEO1 'ET' BO9 ; 'FINSI' ; 'SI' ( IBOB '>EG' 10 ) ; GEO1 = GEO1 'ET' BO10 ; 'FINSI' ; 'MESS' 'Maillage bobine ' IBOB ' genere pour controle' ; TABMAI.IBOB = GEO1 ; * tables de travail contenant des infos sur la bobine IBOB TABTRAV1.IBOB = SURFBO1 ; TABTRAV2.IBOB = SURFBO2 ; TABTRAV3.IBOB = SURFBO3 ; TABTRAV4.IBOB = SURFBO4 ; TABTRAV5.IBOB = VNOR ; 'SINON' ; 'QUITTER' BOUCBOB ; 'FINSI' ; IBOB = IBOB + 1 ; 'FIN' BOUCBOB ; IBOB = IBOB - 1 ; * 'OUBLIER' P1 ; 'OUBLIER' P2 ; 'OUBLIER' SURFBO1 ; 'OUBLIER' P3 ; 'OUBLIER' P4 ; 'OUBLIER' SURFBO2 ; 'OUBLIER' D1 ; 'OUBLIER' D2 ; 'OUBLIER' SURFBO3 ; 'OUBLIER' D3 ; 'OUBLIER' D4 ; 'OUBLIER' SURFBO4 ; 'OUBLIER' SURF1 ;'OUBLIER' SURF2 ;'OUBLIER' SURF3 ; 'OUBLIER' SURF4 ;'OUBLIER' SURFBOB ; * 'SI' ( IBOB '>EG' 1 ) ; CBB1 = CBB1 / IBOB ;CBB2 = CBB2 / IBOB ;CBB3 = CBB3 / IBOB ; CBB = CBB1 CBB2 CBB3 ; CBX2 = (CBB1 + (2. * REMAX)) CBB2 CBB3 ; CBY2 = CBB1 (CBB2 + (2. * REMAX)) CBB3 ; CBZ2 = CBB1 CBB2 (CBB3 + (2. * REMAX)) ; 'OUBLIER' CBB ; 'OUBLIER' CBX2 ; 'OUBLIER' CBY2 ; 'OUBLIER' CBZ2 ; GEO1 = GEO1 'ET' AXEX 'ET' AXEY 'ET' AXEZ ; 'FINSI' ; 'SI' ( IGRAPH1 ) ; 'REPETER' BOUGRAF1 ; 'OBTENIR' OEILX*'FLOTTANT' ; 'OBTENIR' OEILY*'FLOTTANT' ; 'OBTENIR' OEILZ*'FLOTTANT' ; OEIL = OEILX OEILY OEILZ ; 'TITRE' 'POLO : maillages des bobines' ; 'TRAC' 'CACH' GEO1 OEIL 'QUAL' ; 'OBTENIR' REP1*'ENTIER' ; 'SI' ( REP1 'EGA' 0 ) ; 'QUITTER' BOUGRAF1 ; 'FINSI' ; 'FIN' BOUGRAF1 ; 'FINSI' ; * * Etape 2 : contour des bobines dans les plans de coupe * 'SI' ( 'EXISTE' PL1 ) ; 'SAUTER' 1 'LIGNE' ; 'SAUTER' 1 'LIGNE' ; TABLIG = TABLE ; TAB2.LIG = TABLIG ; ICOUP = 1 ; 'REPETER' BOUCOUP ; 'SI' ( 'EXISTE' PL1 ICOUP ) ; * * Infos concernant le plan de coupe ICOUP * 'MESS' 'Lecture infos plan de coupe ' ICOUP ; COUP1 = PL1.ICOUP ; IRECUP = 0 ; 'SI' ( 'EXISTE' COUP1 'MAIL' ) ; 'SAUTER' 1 'LIGNE' ; LB*'MAILLAGE' = COUP1.'MAIL' ; IRECUP = 1 ; IINTER = 0 ; 'SINON' ; 'SI' ( 'EXISTE' COUP1 'PP' ) ; PP*'POINT' = COUP1.'PP' ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'Erreur : il manque PP pour le plan ' ICOUP ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; 'SI' ( 'EXISTE' COUP1 'VP' ) ; VP*'POINT' = COUP1.'VP' ; 'SINON' ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'Erreur : il manque VP pour le plan ' ICOUP ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; * * Trois points vont definir ce plan : PP PP2 et PP3 * PP11 PP12 PP13 = COORD PP ; VP1 VP2 VP3 = COORD VP ; * * Vecteur WN tq : VP1 WN1 + VP2 WN2 + VP3 WN3 = 0 * VPN1 = ( (VP1**2) + (VP2**2) + (VP3**2) ) ** 0.5 ; 'SI' ( VPN1 'EGA' 0. ) ; 'SAUTER' 1 'LIGNE' ; 'MESS' 'ERREUR : plan ' ICOUP ' le vecteur VP est nul' ; 'SAUTER' 1 'LIGNE' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; VN1 = VP1 / VPN1 ; VN2 = VP2 / VPN1 ; VN3 = VP3 / VPN1 ; VPN = VN1 VN2 VN3 ; 'SI' ( VN1 'NEG' 0. ) ; 'SI' ( VN2 'NEG' 0. ) ; 'SI' ( VN3 'NEG' 0. ) ; W2 = VN3 / VN2 ; W3 = -1 ; WN = ( (W2**2) + (W3**2) ) ** 0.5 ; WN1 = 0. ; WN2 = W2 / WN ; WN3 = W3 / WN ; 'SINON' ; WN1 = 0. ; WN2 = 0. ; WN3 = 1. ; 'FINSI' ; 'SINON' ; 'SI' ( VN3 'NEG' 0. ) ; WN1 = 0. ; WN2 = 1. ; WN3 = 0. ; 'SINON' ; WN1 = 0. ; WN2 = 0. ; WN3 = 1. ; 'FINSI' ; 'FINSI' ; 'SINON' ; WN1 = 1. ; WN2 = 0. ; WN3 = 0. ; 'FINSI' ; * XN1 = (VN2 * WN3) - (VN3 * WN2) ; XN2 = (VN3 * WN1) - (VN1 * WN3) ; XN3 = (VN1 * WN2) - (VN2 * WN1) ; * * WN et XN forment une base du plan de coupe * PP21 = PP11 + WN1 ; PP22 = PP12 + WN2 ; PP23 = PP13 + WN3 ; PP31 = PP11 + XN1 ; PP32 = PP12 + XN2 ; PP33 = PP13 + XN3 ; PP2 = PP21 PP22 PP23 ; PP3 = PP31 PP32 PP33 ; * * Intersection de ce plan avec bobine IBO * IBO = 1 ; IINTER = 0 ; 'REPETER' BOUCI ; 'SI' ( 'EXISTE' TABMAI IBO ) ; 'MESS' 'Recherche intersection plan : ' ICOUP ' bobine : ' IBO ; IMAI = 1 ; BOB1 = TABOB1.IBO ; CBOB1 = BOB1.'C' ; HBOB1 = BOB1.'H' ; VNOR1 = TABTRAV5.IBO ; * * On traite separement chaque quart de bobine * IINTEI = 0 ; 'REPETER' QUARBOB 4 ; 'SI' ( IMAI 'EGA' 1 ) ; MAI0 = TABTRAV1.IBO ; 'FINSI' ; 'SI' ( IMAI 'EGA' 2 ) ; MAI0 = TABTRAV2.IBO ; 'FINSI' ; 'SI' ( IMAI 'EGA' 3 ) ; MAI0 = TABTRAV3.IBO ; 'FINSI' ; 'SI' ( IMAI 'EGA' 4 ) ; MAI0 = TABTRAV4.IBO ; 'FINSI' ; MAI1 = 'CHANGER' 'POI1' MAI0 ; 'SI' (IDBG2) ; 'FINSI' ; IP1 = 1 ; IDESSOUS = 0 ; IDESSUS = 0 ; IDEDANS = 0 ; DMOY = 0. ; 'REPETER' BOUCPOI1 NBP1 ; POX1 POY1 POZ1 = 'COORD' PO1 ; MX1 = POX1 - PP11 ; MY1 = POY1 - PP12 ; MZ1 = POZ1 - PP13 ; M1 = MX1 MY1 MZ1 ; PDT1 = M1 'PSCAL' VPN ; DMOY = DMOY + ('ABS' (PDT1)) ; 'SI' ( ( 'ABS' PDT1 ) < 0.001 ) ; IDEDANS = IDEDANS + 1 ; 'FINSI' ; 'SI' ( PDT1 '<EG' -0.001 ) ; IDESSOUS = IDESSOUS + 1 ; 'FINSI' ; 'SI' ( PDT1 '>EG' 0.001 ) ; IDESSUS = IDESSUS + 1 ; 'FINSI' ; 'SI' ( IP1 'EGA' 1 ) ; 'SINON' ; 'FINSI' ; IP1 = IP1 + 1 ; 'FIN' BOUCPOI1 ; *+* *+* Distance de selection des points a projeter *+* on divise DMOY par 2 si NELE = 4 *+* 3 8 COEF1 = 3. ; DMOY = DMOY / NBP1 ; DCRIT = DMOY / COEF1 ; * * tests sur la repartition des points / plan de coupe * 'SI' ( IDEDANS '>EG' 4 ) ; ICAS = 1 ; 'SINON' ; 'SI' ( IDESSUS > IDESSOUS ) ; ICAS = 2 ; 'SINON' ; ICAS = 3 ; 'FINSI' ; 'FINSI' ; * 'SI' ((( IDESSOUS '>EG' 1 ) 'ET' ( IDESSUS '>EG' 1 )) 'OU' ( IDEDANS '>EG' 1 )) ; IINTER = IINTER + 1 ; IINTEI = IINTEI + 1 ; 'SI' ( IINTEI 'EGA' 1 ) ; 'MESS' 'Il y a une intersection ...' ; 'FINSI' ; * * On ne retient que les points les plus proches du * plan de coupe Pc *+* IREC = 0 ; 'REPETER' BOUCREC 7 ; IREC = IREC + 1 ; IP2 = 1 ; IOK = 0 ; 'REPETER' BOUCTRI NBP1 ; VAL1 = 'EXTRAIRE' LISPDT IP2 ; 'SI' ( ICAS 'EGA' 1 ) ; 'SI' (('ABS' VAL1 ) '<EG' 0.001 ) ; IOK = IOK + 1 ; 'SI' ( IOK 'EGA' 1 ) ; 'SINON' ; 'FINSI' ; 'FINSI' ; 'FINSI ' ; 'SI' ( ICAS 'EGA' 2 ) ; 'SI' ((('ABS' VAL1 ) '<EG' DCRIT ) 'ET' ( VAL1 '>EG' 0.001 )) ; IOK = IOK + 1 ; 'SI' ( IOK 'EGA' 1 ) ; 'SINON' ; 'FINSI' ; 'FINSI' ; 'FINSI' ; 'SI' ( ICAS 'EGA' 3 ) ; 'SI' ((('ABS' VAL1 ) '<EG' DCRIT ) 'ET' ( VAL1 < -0.001)) ; IOK = IOK + 1 ; 'SI' ( IOK 'EGA' 1 ) ; 'SINON' ; 'FINSI' ; 'FINSI' ; 'FINSI' ; IP2 = IP2 + 1 ; 'FIN' BOUCTRI ; 'SI' (IDBG2) ; 'FINSI' ; 'SI' ( NBP2 < 4 ) ; 'SI' ( IREC '<EG' 6 ) ; 'MESS' 'Pas assez de points selectionnes' ; 'MESS' 'essai nouvelle distance critique' ; DCRIT = DCRIT * 1.25 ; 'SINON' ; 'MESS' 'Mauvaise selection des points : ' ; 'MESS' 'contour introuvable !' ; IERR = 1 ; 'QUITTER' PROC ; 'FINSI' ; 'SINON' ; 'QUITTER' BOUCREC ; 'FINSI' ; 'FIN' BOUCREC ; * * Construction de LIGi * * * recherche de WMIN, XWMIN et d'un point oppose * II1 = 1 ; 'REPETER' BOUCP1 NBP1 ; PEX1 PEY1 PEZ1 = 'COORD' PE1 ; VV1 = PEX1 - PP11 ; VV2 = PEY1 - PP12 ; VV3 = PEZ1 - PP13 ; PEW1 = (VV1 * WN1) + (VV2 * WN2) + (VV3 * WN3) ; PEX1 = (VV1 * XN1) + (VV2 * XN2) + (VV3 * XN3) ; 'SI' ( II1 'EGA' 1 ) ; WMIN = PEW1 ; XWMIN = PEX1 ; IIMIN = 1 ; 'SINON' ; 'SI' ( PEW1 < WMIN ) ; WMIN = PEW1 ; XWMIN = PEX1 ; IIMIN = II1 ; 'FINSI' ; 'FINSI' ; II1 = II1 + 1 ; 'FIN' BOUCP1 ; * II2 = 1 ; DIAG0 = 0. ; 'REPETER' BOUCP2 NBP1 ; LW1 = 'EXTRAIRE' LW II2 ; LX1 = 'EXTRAIRE' LX II2 ; DIAG1 = ( ((LW1 - WMIN) ** 2) + ((LX1 - XWMIN) ** 2) ) ** 0.5 ; 'SI' ( DIAG1 > DIAG0 ) ; DIAG0 = DIAG1 ; IIMAX = II2 ; 'FINSI' ; II2 = II2 + 1 ; 'FIN' BOUCP2 ; PCX1 PCY1 PCZ1 = 'COORD' PC1 ; PCX2 PCY2 PCZ2 = 'COORD' PC2 ; * * PQ = PC2 - PC1 * PQX1 = PCX2 - PCX1; PQY1 = PCY2 - PCY1; PQZ1 = PCZ2 - PCZ1; PQ = PQX1 PQY1 PQZ1 ; * * PN = PQ ^ VN * PNX1 = (PQY1 * VN3) - (PQZ1 * VN2) ; PNY1 = (PQZ1 * VN1) - (PQX1 * VN3) ; PNZ1 = (PQX1 * VN2) - (PQY1 * VN1) ; PN = PNX1 PNY1 PNZ1 ; * * Recherche des deux autres points -> PC3 et PC4 * II3 = 1 ; PSCAMAX = 0. ; PSCAMIN = 0. ; 'REPETER' BOUCP3 NBP1 ; PEX1 PEY1 PEZ1 = 'COORD' PE1 ; VV1 = PEX1 - PCX1 ; VV2 = PEY1 - PCY1 ; VV3 = PEZ1 - PCZ1 ; PSC1 = (VV1 * PNX1) + (VV2 * PNY1) + (VV3 * PNZ1) ; 'SI' ( PSC1 > PSCAMAX ) ; PSCAMAX = PSC1 ; IIMAX = II3 ; 'FINSI' ; 'SI' ( PSC1 < PSCAMIN ) ; PSCAMIN = PSC1 ; IIMIN = II3 ; 'FINSI' ; II3 = II3 + 1 ; 'FIN' BOUCP3 ; L1 = 'DROITE' 1 PC1 PC3 ; L2 = 'DROITE' 1 PC3 PC2 ; L3 = 'DROITE' 1 PC2 PC4 ; L4 = 'DROITE' 1 PC4 PC1 ; LIG1 = L1 'ET' L2 'ET' L3 'ET' L4 ; 'SI' ( IBO 'EGA' 1 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO1 ; 'SINON' ; LB = LB 'ET' BO1 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO 'EGA' 2 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO2 ; 'SINON' ; LB = LB 'ET' BO2 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO 'EGA' 3 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO3 ; 'SINON' ; LB = LB 'ET' BO3 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO 'EGA' 4 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO4 ; 'SINON' ; LB = LB 'ET' BO4 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO 'EGA' 5 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO5 ; 'SINON' ; LB = LB 'ET' BO5 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO 'EGA' 6 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO6 ; 'SINON' ; LB = LB 'ET' BO6 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO 'EGA' 7 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO7 ; 'SINON' ; LB = LB 'ET' BO7 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO 'EGA' 8 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO8 ; 'SINON' ; LB = LB 'ET' BO8 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO 'EGA' 9 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO9 ; 'SINON' ; LB = LB 'ET' BO9 ; 'FINSI' ; 'FINSI' ; 'SI' ( IBO '>EG' 10 ) ; 'SI' ( IINTER 'EGA' 1 ) ; LB = BO10 ; 'SINON' ; LB = LB 'ET' BO10 ; 'FINSI' ; 'FINSI' ; 'SINON' ; 'FINSI' ; IMAI = IMAI + 1 ; 'FIN' QUARBOB ; 'SI' ( IINTEI '>EG' 1 ) ; * * Axe de la bobine IBO (s'il y a un contour) * CBOBX1 CBOBY1 CBOBZ1 = 'COORD' CBOB1 ; A1 = CBOBX1 - PP11 ; A2 = CBOBY1 - PP12 ; A3 = CBOBZ1 - PP13 ; PSC1 = (A1 * VN1) + (A2 * VN2) + (A3 * VN3) ; CB1 = CBOBX1 - (PSC1 * VN1) ; CB2 = CBOBY1 - (PSC1 * VN2) ; CB3 = CBOBZ1 - (PSC1 * VN3) ; CBB1 = CBB1 + CB1 ; CBB2 = CBB2 + CB2 ; CBB3 = CBB3 + CB3 ; VNORX1 VNORY1 VNORZ1 = 'COORD' VNOR1 ; PAX1 = CB1 + (HBOB1 * VNORX1) ; PAY1 = CB2 + (HBOB1 * VNORY1) ; PAZ1 = CB3 + (HBOB1 * VNORZ1) ; PAX2 = CB1 - (HBOB1 * VNORX1) ; PAY2 = CB2 - (HBOB1 * VNORY1) ; PAZ2 = CB3 - (HBOB1 * VNORZ1) ; PA1 = PAX1 PAY1 PAZ1 ; PA2 = PAX2 PAY2 PAZ2 ; DAXE1 = 'DROITE' 1 PA1 PA2 ; LB = LB 'ET' DAXE1 ; 'FINSI' ; 'SINON' ; 'QUITTER' BOUCI ; 'FINSI' ; IBO = IBO + 1 ; 'FIN' BOUCI ; 'FINSI' ; * 'SI' ( IINTER '>EG' 1 ) ; 'OUBLIER' PC1 ;'OUBLIER' PC2 ;'OUBLIER' PC3 ;'OUBLIER' PC4 ; 'OUBLIER' L1 ;'OUBLIER' L2 ;'OUBLIER' L3 ;'OUBLIER' L4 ; 'OUBLIER' LIG1 ; 'OUBLIER' POIPROJ ; 'OUBLIER' DAXE1 ; 'OUBLIER' PA1 ; 'OUBLIER' PA2 ; 'OUBLIER' PE1 ; 'OUBLIER' SYME1 ; 'FINSI' ; * * Trace intersection des bobines / plan ICOUP * 'SI' (( IGRAPH2 ) 'ET' (( IINTER '>EG' 1 ) 'OU' ( IRECUP 'EGA' 1 ))); 'REPETER' BOUGRAF2 ; 'OBTENIR' OEILX*'FLOTTANT' ; 'OBTENIR' OEILY*'FLOTTANT' ; 'OBTENIR' OEILZ*'FLOTTANT' ; OEIL = OEILX OEILY OEILZ ; 'TITRE' 'Contour des bobines / plan ' ICOUP ; 'TRAC' LB OEIL 'QUAL' ; 'OBTENIR' REP2*'ENTIER' ; 'SI' ( REP2 'EGA' 0 ) ; 'QUITTER' BOUGRAF2 ; 'FINSI' ; 'FIN' BOUGRAF2 ; 'FINSI' ; * * Archivage de l'intersection dans TAB2.LIG.j * 'SI' (( IINTER '>EG' 1 ) 'OU' ( IRECUP 'EGA' 1 )) ; TABLIG.ICOUP = LB ; 'FINSI' ; 'SINON' ; 'QUITTER' BOUCOUP ; 'FINSI' ; ICOUP = ICOUP + 1 ; 'FIN' BOUCOUP ; 'FINSI' ; * * Etape 3 : pour chaque bobine, calcul du champ de Biot et Savart * dans GEO1 et dans les maillages LIGi * 'SAUTER' 1 'LIGNE' ; 'SAUTER' 1 'LIGNE' ; * * Calcul du champ dans les maillages GEO1 : * contribution de chaque bobine * TABCHB = 'TABLE' ; IGEO1 = 1 ; 'REPETER' BOGEO1 ; 'SI' ( 'EXISTE' TAGEO1 IGEO1 ) ; 'SI' ( IGEO1 'EGA' 1 ) ; 'SINON' ; 'FINSI' ; 'SAUTER' 1 'LIGNE' ; GEO1 = TAGEO1.IGEO1 ; IBOB = 1 ; 'REPETER' BOUCBO2 ; 'SI' ('EXISTE' TABOB1 IBOB ) ; BOB1 = TABOB1.IBOB ; RI = BOB1.'RI' ; RE = BOB1.'RE' ; H = BOB1.'H' ; SOL = BOB1.'SOL' ; C = BOB1.'C' ; PP1 = TABTRAV6.IBOB ; PP2 = TABTRAV7.IBOB ; 'SI' ( IBOB 'EGA' 1 ) ; 'SINON' ; CHB1 = CHB1 'ET' 'FINSI' ; 'SINON' ; 'QUITTER' BOUCBO2 ; 'FINSI' ; IBOB = IBOB + 1 ; 'FIN' BOUCBO2 ; TABCHB.IGEO1 = CHB1 ; 'SINON' ; 'QUITTER' BOGEO1 ; 'FINSI' ; IGEO1 = IGEO1 + 1 ; 'FIN' BOGEO1 ; * * Calcul du champ dans LIG.j * 'SI' ( 'EXISTE' PL1 ) ; 'SAUTER' 1 'LIGNE' ; 'SAUTER' 1 'LIGNE' ; TABCH1 = 'TABLE' ; TAB2.CHBLIG = TABCH1 ; ICOUP = 1 ; 'REPETER' BOUCOU2 ; 'SI' ( 'EXISTE' PL1 ICOUP ) ; GEO2 = TABLIG.ICOUP ; IBOB = 1 ; 'REPETER' BOUCBO3 ; 'SI' ('EXISTE' TABOB1 IBOB ) ; BOB1 = TABOB1.IBOB ; RI = BOB1.'RI' ; RE = BOB1.'RE' ; H = BOB1.'H' ; SOL = BOB1.'SOL' ; C = BOB1.'C' ; PP1 = TABTRAV6.IBOB ; PP2 = TABTRAV7.IBOB ; 'MESS' 'Plan ' ICOUP ' : appel a Biot pour la bobine ' IBOB ; 'SI' ( IBOB 'EGA' 1 ) ; DENS MU0 ; 'SINON' ; 'FINSI' ; 'SINON' ; 'QUITTER' BOUCBO3 ; 'FINSI' ; IBOB = IBOB + 1 ; 'FIN' BOUCBO3 ; TABCH1.ICOUP = CHB2 ; 'SINON' ; 'QUITTER' BOUCOU2 ; 'FINSI' ; ICOUP = ICOUP + 1 ; 'FIN' BOUCOU2 ; 'FINSI' ; * 'FIN' PROC ; * * On fait un peu de menage ... * 'MENAGE' ; 'SAUTER' 1 'LIGNE' ; 'SI' ( 'EGA' IERR 1 ) ; 'SINON' ; 'FINSI' ; 'SAUTER' 1 'LIGNE' ; 'FINPROC' TABCHB TAB2 ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales