Prezentarea unui program cu elemente finite capabil a fi folosit în ...

24
Lab. 01. Prezentarea unui program cu elemente finite capabil a fi folosit în analiza de optimizare. Exemplu simplu de optimizare pentru o grindă în consolă Ghid de modelare parametrică 3D Orice program cu elemente finite comercial este un produs executabil obŃinut prin compilarea unui text sursă dezvoltat în medii de programare gen Fortran, C, Visual Basic, etc. Pentru a fi un produs flexibil de regulă aceste programe sunt concepute în forma unor comenzi de generare a geometriei, rezolvare a problemei şi vizualizarea rezultatelor. Aceste comenzi particularizate constituie practic un alt limbaj de programare propriu programului cu elemente finite. Pentru a spori viteza de lucru a utilizatorului, în momentul de faŃă programele accesează comenzile interne prin intermediul unor programe de interfaŃă grafică. Astfel utilizatorul utilizează de regulă mouse-ul şi tastatura cu cifre. În ANSYS acest mod de lucru se numeşte GUI (Graphic User Interface). Utilizatorii experimentaŃi pot utiliza comenzile ANSYS care se introduc prin linia de comandă. De regulă programele monitorizează toate comenzile utilizatorului într-un fişier text (în ANSYS numit log) care poate fi eventual refolosit. 1.1. Introducere în limbajul de programare parametrică din ANSYS Programul ANSYS a fost conceput să poată fi utilizat şi prin intermediul unui limbaj de programare parametrică APDL (ANSYS Parametric Design Language). Acesta permite utilizarea comenzilor de generare a modelului din programul cu elemente finite în termenii unor parametri (variabile). Deasemenea o serie de rezultate pot fi extrase prin intermediul unor parametri şi utilizate pentru a obŃine o serie de funcŃii necesare în special în modulul de optimizare. Descrierea parametrică a unor comenzi echivalează cu crearea unor funcŃii utilizator care pot fi utilizate pentru o clasă largă de aplicaŃii similare, adică spre exemplu dacă modelul unei structuri variază în raport cu o serie de parametri, odată creat un singur model parametric, celelalte modele geometrice se pot obŃine din acesta printr-o apelare a funcŃiei create cu parametrii actuali. Uneori este necesară repetarea unor comenzi (do-loops) sau introducerea unor blocuri de decizie (if-then-else), sau utilizarea unor operaŃii vectoriale sau matriceale (înmulŃiri, inversări de matrice). Toate acestea se pot efectua cu ajutorul acestui limbaj intern de programare. APDL stă la baza utilizării algoritmilor de optimizare şi discretizare adaptivă şi oferă avantaje chiar şi pentru modelarea unei structuri singulare, deoarece spre exemplu o serie de mărimi care conŃin multe caractere (zecimale), sau care se obŃin prin operaŃii algebrice simple, pot fi declarate o singură dată şi apoi pot fi folosite de mai multe ori. În acest ghid se descriu o serie de facilităŃi ale APDL cum ar fi parametri, macrouri, blocuri de decizie, cicluri, parametri tip matrice. Pentru exemplificare se prezintă o serie de exemple prezentate în helpul programului ANSYS precum şi o serie de aplicaŃii create pentru lărgirea şi exemplificarea prezentării. Nu se insistă pe comenzile programului ANSYS, care sunt în număr de câteva mii, ci pe modul în care aceste comenzi pot fi utilizate prin intermediul unor parametri definiti de utilizator. Totuşi, o serie de comenzi, care folosesc la definirea şi lucrul cu parametri, se prezintă complet. 1.1.1. Utilizarea parametrilor

Transcript of Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Page 1: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Lab. 01. Prezentarea unui program cu elemente finite capabil a fi folosit în

analiza de optimizare. Exemplu simplu de optimizare pentru o grindă în

consolă

Ghid de modelare parametrică 3D Orice program cu elemente finite comercial este un produs executabil obŃinut prin compilarea unui text sursă dezvoltat în medii de programare gen Fortran, C, Visual Basic, etc. Pentru a fi un produs flexibil de regulă aceste programe sunt concepute în forma unor comenzi de generare a geometriei, rezolvare a problemei şi vizualizarea rezultatelor. Aceste comenzi particularizate constituie practic un alt limbaj de programare propriu programului cu elemente finite. Pentru a spori viteza de lucru a utilizatorului, în momentul de faŃă programele accesează comenzile interne prin intermediul unor programe de interfaŃă grafică. Astfel utilizatorul utilizează de regulă mouse-ul şi tastatura cu cifre. În ANSYS acest mod de lucru se numeşte GUI (Graphic User Interface). Utilizatorii experimentaŃi pot utiliza comenzile ANSYS care se introduc prin linia de comandă. De regulă programele monitorizează toate comenzile utilizatorului într-un fişier text (în ANSYS numit log) care poate fi eventual refolosit.

1.1. Introducere în limbajul de programare parametrică din ANSYS

Programul ANSYS a fost conceput să poată fi utilizat şi prin intermediul unui limbaj de programare parametrică APDL (ANSYS Parametric Design Language). Acesta permite utilizarea comenzilor de generare a modelului din programul cu elemente finite în termenii unor parametri (variabile). Deasemenea o serie de rezultate pot fi extrase prin intermediul unor parametri şi utilizate pentru a obŃine o serie de funcŃii necesare în special în modulul de optimizare. Descrierea parametrică a unor comenzi echivalează cu crearea unor funcŃii utilizator care pot fi utilizate pentru o clasă largă de aplicaŃii similare, adică spre exemplu dacă modelul unei structuri variază în raport cu o serie de parametri, odată creat un singur model parametric, celelalte modele geometrice se pot obŃine din acesta printr-o apelare a funcŃiei create cu parametrii actuali. Uneori este necesară repetarea unor comenzi (do-loops) sau introducerea unor blocuri de decizie (if-then-else), sau utilizarea unor operaŃii vectoriale sau matriceale (înmulŃiri, inversări de matrice). Toate acestea se pot efectua cu ajutorul acestui limbaj intern de programare. APDL stă la baza utilizării algoritmilor de optimizare şi discretizare adaptivă şi oferă avantaje chiar şi pentru modelarea unei structuri singulare, deoarece spre exemplu o serie de mărimi care conŃin multe caractere (zecimale), sau care se obŃin prin operaŃii algebrice simple, pot fi declarate o singură dată şi apoi pot fi folosite de mai multe ori. În acest ghid se descriu o serie de facilităŃi ale APDL cum ar fi parametri, macrouri, blocuri de decizie, cicluri, parametri tip matrice. Pentru exemplificare se prezintă o serie de exemple prezentate în helpul programului ANSYS precum şi o serie de aplicaŃii create pentru lărgirea şi exemplificarea prezentării. Nu se insistă pe comenzile programului ANSYS, care sunt în număr de câteva mii, ci pe modul în care aceste comenzi pot fi utilizate prin intermediul unor parametri definiti de utilizator. Totuşi, o serie de comenzi, care folosesc la definirea şi lucrul cu parametri, se prezintă complet.

1.1.1. Utilizarea parametrilor

Page 2: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Parametri sunt variabile APDL (ei sunt similari variabilelor din Fortran). Aceştia nu trebuie declaraŃi ca tip (intregi, reali, etc). Toate variabilele intregi sau reale sunt alocate în dublă precizie. Parametri utilizaŃi fără a fi iniŃializaŃi sunt automat setaŃi la o valoare foarte mică, practic zero, adică aproximativ 2-100. ANSYS utilizează două tipuri de parametri: scalari şi matrice (array). Variabile de tip şir de caractere (de lungime maximă opt caractere) pot fi atribuite unor parametri prin simpla încadrare între apostroafe simple. Pentru tipul array APDL permite câteva tipuri particulare de variabile şi anume: numerice, caracter, şir şi tabel (table). Aceastea din urmă folosesc la obŃinerea unor valori interpolate liniar, de exemplu la definirea unei încărcări cu variaŃie în timp. Un parametru poate înlocui argumentul unei comenzi ANSYS oarecare cu condiŃia să fie definit anterior la valoarea dorită de utilizator şi acceptată de program. 1.1.2. Reguli de atribuire a numelor parametrilor

Parametrii trebuie să: înceapă cu o literă; să conŃină numai litere, numere şi caracterul underscore (liniuŃă jos); să nu conŃină mai mult de 32 de caractere. Exemple de parametri valizi sunt:

A1, A2345, PI, A_1 etc. Exemple de parametri greşit definiŃi sunt:

1A, A&B etc. Se precizează că limbajul ANSYS nu este case sensitive, adică atât parametri cât şi

comenzile pot fi apelate fie cu litere mari, sau mici fie cu litere combinate. Se recomandă ca parametrii definiŃi de utilizator să nu coincidă cu o serie de nume gen etichetă (label) din ANSYS cum ar fi: DOF, TEMP, UX, PRES, ALL, PICK, STAT, CHAR, ARRAY, TABLE etc. O serie de alŃi parametri numiŃi ARG1 până la ARG9 şi AR10 până la AR99 sunt rezervaŃi pentru parametri locali din macrouri. Deasemenea nu se recomandă utilizarea numelor atribuite unor funcŃii de prescurtare (adică definiŃi prin comanda ANSYS *ABBR) precum şi a parametrilor care încep cu caracterul liniuŃă jos, adică _A1 de exemplu, deoarece aceştia sunt rezervaŃi pentru lucru intern al programului. 1.1.3. Definirea parametrilor

În continuare, dacă nu se specifică, parametri definiŃi pot fi atribuiŃi atât variabilelor scalari cât şi array. Parametrii pot fi specificaŃi explicit, sau pot fi extraşi din baza de date a programului ANSYS folosind funcŃia complexă *GET. Atribuirea valorilor unor parameteri se poate face cu comanda *SET sau direct folosind caracterul =, de exemplu comenzile de mai jos sunt echivalente *SET,A1,-24 A1=-24 *SET,grosime,2.07E-3 Grosime=2.07E-3 *SET,A2,A1 A2=A1 *SET,CPARM,'CASE1' CPARM='CASE1' ObŃinerea (extragerea) unor date (de intrare sau rezultate) în parametri definiŃi de utilizator este posibilă numai prin utilizarea funcŃiei *GET, fie direct fie ca argument în anumite funcŃii implicate în calculul parametrilor. Comanda *GET extrage valori numerice care corespund definiŃiei unui nod, element, arii, volum etc şi le stochează într-un parametru definit de utilizator. De exemplu comanda *GET,XG5,ELEM,5,CENT,X

Page 3: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

atribuie parametrului XG5 coordonata centrului de greutate pe direcŃia X a elementului finit cu numărul 5. Comanda *GET se apelează ca o funcŃie cu o serie de parametri actuali care trebuie să fie corect definiŃi pentru a obŃine ceea ce se doreşte. Formatul complet al acesteia este: *GET,Par,Entity,ENTNUM,Item1,IT1NUM,Item2,IT2NUM în care: -Par este parametrul care defineşte mărimea căutată; -Entity este un cuvânt cheie legat de caracteristica mărimii salvate în parametru. De exemplu NODE, ELEM, KP, LINE, AREA, VOLU, etc; -ENTNUM este numărul entităŃii sau zero pentru unele cuvinte cheie; -Item1 este numele caracteristicii unei entităŃi particulare, de exemplu, dacă Entity este ELEM, Item1 poate fi fie NUM (cel mai mic sau cel mai mare număr de element din lista de elemente selectate) sau COUNT (numărul de element din set). Comanda *GET poate fi imaginată ca o cale dintr-o structură gen arbore, de la general la o informaŃie specifică. Următoarele exemple prezintă câteva posibilităŃi de folosire a acestei comenzi. Prima linie extrage în parametrul MAT_E_25 materialul atribuit elementului cu numărul 25: *GET,MAT_E_25,ELEM,25,ATTR,MAT MAT_E_25 = numărul elementului 25 *GET,V37,ELEM,37,VOLU V37 = volumul elementului 37 *GET,EL52,ELEM,52,HGEN EL52 = valoarea fluxului de căldură generat în

elementul 52 *GET,TMP,ELEM,16,TBULK,3 TMP = temperatura mediului ambiant pentru

elementul 16 pe faŃa 3 *GET,NMAX,NODE,,NUM,MAX NMAX = numărul nodului maxim din setul

selectat *GET,COORD,ACTIVE,,CSYS COORD = numărul sistemului de coordonate

activ Pentru unele caracteristici ale unor entităŃi particulare este posibil a se utiliza o formă scurtă a comenzii *GET. Mai mult uneori formele scurte se pretează la efectuarea directă a unor operaŃii asupra parametrilor, aşa cum se prezintă în exemplul următor. Să presupunem că se doreşte obŃinerea mediei aritmetice a coordonatelor X a două noduri cu numerele 1 şi 2. Pentru acesta se poate folosi secvenŃa de comenzi:

*GET,L1,NODE,1,LOC,X *GET,L2,NODE,2,LOC,X MID=(L1+L2)/2.

Metoda scurtă constă din apelarea MID=(NX(1)+NX(2))/2 în care funcŃia „get” NX(N), întoarce coordonata X a nodului N. Argumentele funcŃiei *Get pot fi parametri sau chiar alte funcŃii get. De exemplu funcŃia

NELEM(ENUM,NPOS) întoarce numărul nodului din poziŃia NPOS pentru elementul cu numărul ENUM. Se reaminteşte că nodurile unui element finit se numerotează I, J, K, L,... şi NPOS ia valorile 1, 2, 3, 4,....Din combinaŃia funcŃiilor

NX(NELEM(ENUM,NPOS)) rezultă coordonata X a acelui nod solicitat de comanda precedentă. Odată definiŃi mai mulŃi parametri, aceştia pot fi vizualizaŃi cu comanda

*STATUS.

Page 4: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Comanda *GET,par,PARM,,MAX

întoarce numărul total de parametri definiŃi. În ANSYS se pot defini pănă la 5000 de parametri. Pentru a şterge un parametru se poate folosi una dintre metodele de atribuire fără valoare, adică pentru a şterge parametrul A1 se pot folosi comenzile echivalente

A1= *SET,A1,

Uneori pentru lucrul cu fişiere (salvare, încărcare dintr-un fişier cu nume specificat prin parametru) se impune folosirea parametrilor şir de caractere atât pentru numele fişierelor cât şi pentru extensiile acestora. Parametri şir de caracter pot avea maximum 8 caractere. De exemplu pentru a lansa în execuŃie un macrou se foloseşte comanda *USE în care argumentul este un şir de caractere alfanumeric cum ar fi: NAME='MACRO' ! MACRO este numele fişierului macrou *USE,NAME ! Se apelează MACRO.MAC dacă extensia fisierului macrou este alta decât MAC atunci aceasta trebuie specificată. Macroul poate fi lansat (apelat) şi direct fără a utiliza explicit comanda *USE:

*SET,DEF,'SY’ NEWMACRO,DEF ! Se apelează fişierul MACROU NEWMACRO.SY Pentru a transforma o valoare numerică într-un şir de caractere, adică a afişa unele valori numerice, se foloseşte parametrul încadrat de semnul %. Spre exemplu dacă în titlu se doreşte afişarea valorii parametrului TM se foloseşte comanda: /TITLE, DISTRIBUTIA TENSIUNILOR LA TIMPUL=%TM%

1.1.4. Expresii parametrice

Expresiile parametrice constau în utilizarea unor operaŃii de adunare, scădere, înmulŃire, împărŃire cu parametri. De exemplu X=A+B P=(R2+R1)/2 D=-B+(E**2)-(4*A*C) ! Se calculează D = -B + E2 - 4AC XYZ=(A<B)+Y**2 ! Se calculează XYZ = A + Y2 dacă A este mai mic decât B; altfel se calculează XYZ = B + Y2 INC=A1+(31.4/9) M=((X2-X1)**2-(Y2-Y1)**2)/2 Operatorii utilizaŃi în APDL sunt:

Operator OperaraŃie

+ Adunare _ Scădere * ÎnmulŃire / ÎmpărŃire ** Ridicare la putere < Mai mic decât > Mai mare decât

Ordinea executării operaŃiilor este cea naturală, pentru formulele complexe se folosesc parantezele. Între operatori şi variabile nu se recomandă utilizarea spaŃiilor. Sunt predefinite următoarele funcŃii: ABS(x) Modulul lui x.

Page 5: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

SIGN(x,y) Valoarea absolută a lui x cu semnul dat de y. Dacă y=0 semnul se consideră pozitiv

EXP(x) Exponentiala lui x (ex). LOG(x) Logaritm natural din x (ln (x)). LOG10(x) Logaritm în baza 10 din x (log10(x)). SQRT(x) Radical din x. NINT(x) Cel mai apropiat întreg de x. MOD(x,y) Restul împărŃirii x/y. Dacă y=0 se obŃine zero (0). RAND(x,y) Se generază numere aleatoare în domeniul x până la y (x = marginea

inferioară, y = marginea superioară). GDIS(x,y) Generarea unei valori cu distribuŃie Gaussiană (normală) de medie x şi

deviaŃie standard y. SIN(x), COS(x), TAN(x)

Sinus, Cosinus, şi Tangenta din x. Implicit x este în radiani dar poate fi schimbată în grade cu ajutorul funcŃiei*AFUN

SINH(x), COSH(x), TANH(x)

Sinus, Cosinus şi Tangent Hiberbolic din x.

ASIN(x), ACOS(x), ATAN(x)

Arcsinus, Arccosinus, şi Arctangentă din x. Variabila x trebuie să fie între -1.0 şi +1.0 pentru ASIN and ACOS. Rezultatul este în radiani dar poate fi schimbat cu *AFUN. Rezultatele sunt în intervalul -pi/2 la +pi/2 pentru ASIN şi ATAN, şi 0 la pi pentru ACOS.

ATAN2(y,x) Arctangentă din y/x cu semnul fiecărei componente considerate. Rezultatele sunt în domeniul -pi la +pi.

VALCHR(CPARM) Valoarea numerică a CPARM (dacă CPARM nu este numeric, se obŃine 0.0).

CHRVAL(PARM) Transformă valoarea numerică a parametrului PARM într-un şir de caractere alfanumerice

UPCASE(CPARM) Litere mari pentru parametrul CPARM. LWCASE(CPARM) Litere mici pentru parametrul CPARM. Câteva exemple de utilizare se prezintă mai jos: PI=ACOS(-1) ! PI = 3,1415... Z3=COS(2*THETA)-Z1**2 R2=SQRT(ABS(R1-3)) X=RAND(-24,R2) ! X = număr aleator între -24 şi R2 *AFUN,DEG ! UnităŃi de măsură pentru unghiuri în GRADE THETA=ATAN(SQRT(3)) ! THETA calculat la 60 grade PHI=ATAN2(-SQRT(3),-1) ! PHI evaluat la -120 grade *AFUN,RAD ! UnităŃi de măsură pentru unghiuri resetat la RADIANI X249=NX(249) ! coordonata pe X a nodului 249 SLOPE=(KY(2)-KY(1))/(KX(2)-KX(1)) ! Panta liniei dintre punctele cheie 1 şi 2 CHNUM=CHRVAL(X) ! CHNUM = valoarea „caracter” a lui X UPPER=UPCASE(LABEL) ! UPPER = valoarea caracter cu litere mari a variabilei LABEL Parametrii definiŃi pot fi salvaŃi într-un fişier cu comanda PARSAV şi pot fi citiŃi cu comanda PARRES.

1.1.5. Parametri de tip ARRAY

Pe lângă parametri scalari se pot defini şi parametri multipli, tip vectori sau matrice. În ANSYS aceşti parameti tip ARRAY pot fi:

Page 6: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

• 1-D (o singură coloană) • 2-D (rânduri şi coloane) • 3-D (rânduri, coloane şi plane) • 4-D (rânduri, coloane, plane şi cărŃi) • 5-D (rânduri, coloane, plane, cărŃi şi rafturi). Programul permite trei tipuri fundamentale de parametri ARRAY: 1. ARRAY. Acest tip este similar vectorilor programului FORTRAN 77 şi este tipul implicit atunci când se dimensionează un vector. Indicii pentru rânduri, coloane si plane sunt numere consecutive întregi care încep cu cifra 1. Elementele vectorilor (matricelor) pot fi numere reale sau întregi. 2. CHAR. Acesta este un vector de caractere cu fiecare element constând din caractere alfanumerice care nu depăşesc opt caractere. Indicii pentru rânduri, coloane si plane sunt numere consecutive întregi care încep cu cifra 1. 3. TABLE. Aceste este un tip special de matrice cu valori numerice care permite programului să calculeze prin interpolare liniară între elementele matricei valori intermediare. Mai mult de atât, se pot defini vectori de indici pentru fiecare rând, coloană sau plan şi aceştia sunt numere reale nu întregi. Elementele matricelor pot fi numere reale sau întregi. Această structură de date permite descrierea unor funcŃii matematice. Deoarece parametrii de tip ARRAY sunt cei uzuali în toate domeniile, în continuare se insistă pe variabilele de tip TABLE (tabel). Orice tabel conŃine un rând şi o coloană de index zero. Valorile corespunzătoare acestor indecşi sunt valori reale în ordine crescătoare şi pot fi definiŃi cu comanda *TAXIS. Fig. 1.1 prezintă structura unei variabile de tip tabel.

Fig. 1.1 Structura unei variabile de tip tabel(6,6,3) Pentru a defini o variabilă de tip ARRAY, mai întâi trebuie declarat tipul şi dimensiunile parametrului utilizând comanda *DIM, aşa cum se prezintă de exemplele de mai jos: *DIM,AA,,4 ! Tipul ARRAY este implicit, dimensiunea 4[x1x1] *DIM,XYZ,ARRAY,12 ! Tipul ARRAY, dimensiunea 12[x1x1] *DIM,FORCE,TABLE,5 ! Tipul TABLE, dimensiunea 5[x1x1] *DIM,T2,,4,3 ! Dimensiunile sunt 4x3[x1] *DIM,CPARR1,CHAR,5 ! Tipul CHAR, dimensiunea 5[x1x1]

Page 7: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Se menŃionează că elementele parametrilor de tip ARRAY şi TABLE sunt iniŃializate la zero, iar parametri de tip CHAR sunt iniŃializaŃi cu valori blanc. Exemplele următoare arată cum se pot iniŃializa valorile parametrilor de tip ARRAY şi TABLE: *DIM,XVAL,ARRAY,X1 *DIM,YVAL,ARRAY,Y1 YVAL(1)=0,20 *DIM,ZVAL,ARRAY,10 ZVAL(1)=10,20,30,40,50,60,70,80,90,100 *DIM,TVAL,ARRAY,5 TVAL(1)=1,.90,.80,.70,.60 *DIM,TEVL,ARRAY,5 TEVL(1)=1,1.20,1.30,1.60,1.80 !!!! CREAZA TABEL 5D PENTRU APLICAREA PRESIUNII X1=2 !!!! DIMENSIUNE X Y1=2 !!!! DIMENSIUNE Y Z1=10 !!!! DIMENSIUNE Z D4=5 !!!! DIMENSIUNEA TIMPULUI D5=5 !!!! DIMENSIUNEA TEMPERATURII LEN=10 !!!! LUNGIMEA BARE INCASTRATE WID=1 !!!! LATIMEA BAREI INCASTRATE HTH=2 !!!! INALTIMEA BARE INCASTRATE *DIM,XVAL,ARRAY,X1 !!!! CREAZA UN VECTOR 1D PENTRU A INCARCATABELUL 5D XVAL(1)=0,20 !!!! VARIATIA PE DIMENSIUNE *DIM,YVAL,ARRAY,Y1 !!!! VALORI DIFERITE PE FIECARE YVAL(1)=0,20 !!!! CARTE SI RAFT *DIM,ZVAL,ARRAY,10 ZVAL(1)=10,20,30,40,50,60,70,80,90,100 *DIM,TVAL,ARRAY,5 TVAL(1)=1,.90,.80,.70,.60 *DIM,TEVL,ARRAY,5 TEVL(1)=1,1.20,1.30,1.60,1.80 *DIM,CCC,TAB5,X1,Y1,Z1,D4,D5,X,Y,Z,TIME,TEMP *TAXIS,CCC(1,1,1,1,1),1,0,WID !!! X-DIM *TAXIS,CCC(1,1,1,1,1),2,0,HTH !!! Y-DIM *TAXIS,CCC(1,1,1,1,1),3,1,2,3,4,5,6,7,8,9,10 !!! Z-DIM *TAXIS,CCC(1,1,1,1,1),4,0,10,20,30,40 !!! TIMP *TAXIS,CCC(1,1,1,1,1),5,0,50,100,150,200 !!! TEMP *DO,II,1,2 *DO,JJ,1,2 *DO,KK,1,10 *DO,LL,1,5 *DO,MM,1,5 CCC(II,JJ,KK,LL,MM)=(XVAL(II)+YVAL(JJ)+ZVAL(KK))*TVAL(LL)*TEVL(MM) *ENDDO

Page 8: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

*ENDDO *ENDDO *ENDDO *ENDDO 1.1.6. Moduri de atribuire a valorilor unor parametri ARRAY

Valorile unor parametri se pot specifica folosind una dintre metodele: -Se foloseşte comanda *SET pentru atribuirea individuală a elementelor, sau forma prescurtată „=”; -Se utilizează comanda *VFILL pentru iniŃializare pe coloane; -Se foloseşte modul interactiv de editare utilizând *VEDIT -Se citesc valorile din fişiere ASCII utilizând comenzile *VREAD şi *TREAD. Folosind comanda *SET (sau „=”) se pot specifica până la 10 valori pe linie. De exemplu pentru a defini un vector XYZ cu 12 valori se pot folosi comenzile: XYZ(1)=59.5,42.494,-9.01,-8.98,-8.98,9.01,-30.6,51 XYZ(9)=-51.9,14.88,10.8,-10.8 Se observă că locul de unde începe completarea trebuie marcat prin indexul de rând (1) sau (9) în exemplul de mai sus. Exemplul următor arată cum se atribuie valori unui parametru de tip ARRAY de dimensiuni 4x3 cu numele T2: T2(1,1)=.6,2,-1.8,4 ! defineşte (1,1),(2,1),(3,1),(4,1) T2(1,2)=7,5,9.1,62.5 ! defineşte (1,2),(2,2),(3,2),(4,2) T2(1,3)=2E-4,-3.5,22,.01 ! defineşte (1,3),(2,3),(3,3),(4,3)

Dacă variabila FORCE de tip tabel definită anterior este

=

0.0

5.238

0.560

0.560

0.0

3.9

5.8

2.7

8.0

6e1

FORCE

atunci comenzile de iniŃializare pot fi: FORCE(1)=0,560,560,238.5,0 FORCE(1,0)=1E-6,.8,7.2,8.5,9.3 În mod similar se pot iniŃializa şi parametri de tip CHAR, pentru exemplificare se prezintă mai jos un exemplu: *DIM,REZULT,CHAR,3 !Vector de tip CHAR de dimensiuni (3,1,1) REZULT(1)='SX','SY','SZ' !Atribuirea valorilor variabilei RESULT Uneori este mai convenabil a se folosi comanda *VFILL pentru a iniŃializa parametri deoarece aceasta permite utilizarea unor funcŃii simple de generare. De exemplu o matrice poate fi obŃinută cu comenzile: *DIM,DTAB,ARRAY,4,3 ! dimensiune 4 x 3, matrice numerică *VFILL,DTAB(1,1),DATA,-3,8,-12,57 ! patru valori încărcate în vectorul 1 *VFILL,DTAB(1,2),RAMP,2.54,2. 4 ! „umple” vectorul 2 cu valori începând cu 2.54 şi apoi incrementate cu 2.4 *VFILL,DTAB(1,3),RAND,1.5,10 ! iniŃializează vectorul 3 cu valori aleatoare între 1.5 şi 10. Rezultatul variază din cauza generării aleatoare.

Page 9: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Lucrul interactiv este permis numai în modul de lucru interactiv, adică în GUI şi se poate efectua cu comanda *VEDIT. Parametrii de tip ARRAY pot fi citiŃi dintr-un fişier ASCII tot în forma precizată de start din locaŃia dorită. Formatul de citire se controlează printr-un descriptor asemănător celor din FORTRAN şi trebuie să urmeze comanda de citire. Descriptorul controlează numărul câmpurilor de citit din fiecare înregistrare, lăŃimea datelor şi poziŃia punctului zecimal. De exemplu dispunând de un fişier numit dataval care conŃine informaŃia: 1.5 7.8 12.3 15.6 -45.6 42.5 şi un vector cu numele EXEMPLU care are dimensiunea 2x3, următoarele comenzi *DIM,EXEMPLU,,2,3 *VREAD,EXEMPLU(1,1),dataval,,,JIK,3,2 (3F6.1) conduc la obŃinerea matricei

=

5.426.456.15

3.128.75.1EXEMPLU .

Se menŃionează că funcŃia *VREAD nu poate fi folosită la citirea unor matrice 4D sau 5D. În mod similar se pot citi şi parametri de tip TABLE, folosind comanda *TREAD. FaŃă de cazul comenzii *VREAD pentru citirea parametrilor de tip ARRAY, comanda *TREAD este mai flexibilă, în sensul că nu necesită o formatare rigidă. Comanda permite ca un număr de linii iniŃiale (de comentariu) să nu fie citite, dar dimensiunea delarată trebuie să fie în concordantă cu numărul de linii şi coloane ale fişierului. Valorile sunt citite pe rânduri pănă când toate coloanele din fiecare rând sunt citite. Se presupune că este creat un fişier ASCII cu numele "T2data.txt" care conŃine temperatura ca funcŃie de timp şi coordonata X şi se doreşte ca aceste date să fie încărcate într-un tabel cu numele "Ttx." Tabelul în forma ASCII arată astfel:

Temp (timp-X-coord) Table

Timp Coordinata X

0 0 .3 .5 .7 .9

0 10 15 20 25 30

1 15 20 25 35 40

2 20 25 35 55 60

4 30 40 70 90 100

În ANSYS, comenzile sunt: *DIM,Ttx,table,4,5,,time,X-COORD *TREAD,Ttx,t2data,txt,,2 Se poate utiliza şi comanda *VGET care este similară comenzii *GET cu deosebirea că se pot atribui mai maulte valori într-un vector. De exemplu comanda

*VGET,A(1),ELEM,5,CENT,X întoarce coordonata X a elementului 5, apoi 6 şi aşa mai departe până când vectorul este complet definit („umplut”). Pentru a modifica anumite valori în baza de date se poate folosi comanda *VPUT care poate fi considerată opusul comenzii *VGET.

Page 10: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Datele din ANSYS pot fi salvate în fişiere utilizând comanda *VWRITE care scrie maximum 10 vectori în fişierul deschis cu comanda *CFOPEN. Formatul de scriere pentru fiecare vector trebuie specificat între paranteze imediat după comanda *VWRITE. Comenzile de formatare corespund compitatorului FORTRAN 77. De exemplu pentru descriptorul F (floating point) care este valabil pentru orice valoare numerică se foloseşte sintaxa:

Fw.d în care w este lăŃimea datei în număr de caractere iar d este numărul de zecimale. Deci pentru un câmp de 10 caractere cu 8 zecimale se declară (F10.8). Pentru câmpuri de caractere se foloseşte descriptorul A, care se foloseşte cu sintaxa:

Aw în care w este lăŃimea datei în număr de caractere. Pentru un parametru cu 8 caractere se foloseşte (A8). Dacă se dispune de matricea

atunci secvenŃa de comenzi X=25 *CFOPEN,VECTOR *VWRITE,SEQU,MYDATA(1,1,1),MYDATA(1,2,1),MYDATA(1,3,1),10.2,X, MYDATA(1,1,1)+3 (F3.0,' ',F8.4,' ',F8.1,' 'F8.6,' ',F4.1,' 'F4.0,' 'F8.1) *CFCLOSE defineşte un parametru X de valoare 25, apoi deschide pentru scriere fişierul VECTOR şi scrie în el un număr de odine (începând cu 1) prin cuvântul cheie SEQU şi apoi alŃi parametri specificaŃi. Rezultă fisierul: 1. 2.1522 3.9 5.286370 10.2 25. 5.2

2. 2.3049 4.0 5.409196 10.2 25. 5.2

3. 2.0105 3.4 5.936638 10.2 25. 5.2

4. 2.3683 3.3 5.632203 10.2 25. 5.2

5. 2.8491 4.8 5.978024 10.2 25. 5.2

6. 2.2280 3.5 5.546851 10.2 25. 5.2

Se menŃionează că în paranteza care defineşte formatarea se pot include şi caractere alfanumerice între apostroafe simple. De exemplu pentru matricea

10 50

1 20 70

30 80

DATA

=

secvenŃa de comenzi: *CFOPEN,VECTOR1,TXT *VWRITE,SEQU,DATA1(1,1),DATA1(1,2),(DATA1(1,1)+DATA1(1,2)) (' ROW',F3.0,' CONTAINS ',2F7.3,'. IS THEIR SUM ',F7.3,' ?') *CFCLOSE are drept rezultat fişierul vector1.txt care arată astfel: ROW 1. CONTAINS 10.000 50.000. IS THEIR SUM 60.000 ?

ROW 2. CONTAINS 20.000 70.000. IS THEIR SUM 60.000 ?

ROW 3. CONTAINS 30.000 80.000. IS THEIR SUM 60.000 ?

Page 11: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

1.1.7. OperaŃii cu vectori şi matrice O modalitate mai rapidă de a efectua operaŃii vectoriale decât utilizarea operaŃiilor în cadrul unui ciclu, cum ar fi adunări/scăderi, sin, cos, produs vectorial sau produs scalar, etc pot fi efectuate cu o serie de comenzi predefinite cum ar fi: *VOPER, *VFUNC, *VSCFUN, *VITRP. Vectorii care se folosesc în cadrul acestor comenzi trebuie declaraŃi anterior cu funcŃia *DIM ca variabile de tip vector sau tabel. Structura comenzii *VOPER este:

*VOPER, ParR, Par1, Oper, Par2, CON1, CON2 în care argumentele funcŃiei sunt: ParR –numele parametrului rezultant care trebuie declarat anterior; Par1 –primul parametru utilizat în operaŃie, poate fi şi un scalar, sau un parametru scalar; Oper - operaŃia care se efectuează, poate fi una dintre:

ADD pentru adunare Par1+Par2; SUB pentru scădere Par1-Par2; MULT pentru înmulŃire Par1*Par2; DIV pentru împărŃire Par1/Par2 (o împărŃire cu zero dă zero!); MIN sau MAX pentru minimum şi maximum; LT, LE, EQ, NE, GE şi GT pentru mai mic, mai mic sau egal, egal, not egal, mai

mare sau egal şi strict mai mare. Rezultatul este 1 pentru adevărat şi 0 pentru fals; DER1 prima derivată d(Par1)/d(Par2). Par2 trebuie să fie în ordine crescătoare; DER2 derivata a doua d2(Par1)/d(Par2)2;

INT1 integrala simplă ∫ Par1 d(Par2), unde CON1 este constanta de interare;

INT2 este integrala consecutivă ∫ ∫ Par1 d(Par2), unde CON1 este constanta de

integrare a primei integrale iar CON2 este constanta de integrare a celei de-a doua integrări. Dacă Par1 conŃine date legate de distribuŃia de acceleraŃie, atunci CON1 este viteza iniŃială iar CON2 este deplasarea iniŃială;

DOT produs scalar; CROSS produs vectorial.

Par2 – al doilea parametru în operaŃie. CON1 – prima constantă de integrare pentru operaŃiile INT1 şi INT2. CON2 - a doua constantă de integrare pentru operaŃia INT2. O comandă similară este *MOPER.

Comanda *VFUNC efectuează o funcŃie asupra unui singur vector Par1 şi are sintaxa: *VFUN, ParR, Func, Par1, CON1, CON2, CON3

în care argumentul Func este funcŃia apelată şi poate fi una dintre funcŃiile uzuale:

ACOS,

ASIN, ASORT (parametrul Par1 este sortat în ordine crescătoare), ATAN,

COMP (compres),

COPY,

COS, COSH,

DIRCOS (cosinusurile directoare ale tensiunilor principale), DSORT (parametrul Par1 este sortat în ordine descrescătoare), EULER (unghiurile Euler pentru tensiunile principale),

Page 12: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

EXP, EXPA (expandare-reversul COMP), LOG,

LOG10, NINT (cel mai apropiat întreg), NOT, PRIN (tensiunile principale din componente), PWR (funcŃia putere), SIN,

SINH,

SQRT,

TAN, TANH,

TANG (tangenta la o curbă), NORM (normala la o curbă), LOCAL (transformă coordonatele globale într-un sistem de coordonate local), GLOBAL (transformă coordonatele dintr-un sistem de coordonate local în sistemul de

coordonate global). Par1 – parametrul implicat în operaŃie. CON1, CON2, CON3 - constante (utilizate doar pentru funcŃiile PWR, NORM, LOCAL şi GLOBAL). Deci operaŃiile efectuate pot fi rezumate în

ParR = f(Par1) unde funcŃia (f) a fost descrisă mai sus. Dacă rezultatul depăşeşte domeniul de reprezentare al numerelor, adică partea exponenŃială este mai mică decât -32 ori mai mare decât 32 atunci funcŃia atribuie valoarea zero. OperaŃiile continuă să „umple” vectorul ParR complet dacă nu există alte specificaŃii suplimentare date prin comenzile *VLEN sau *VMASK.

Comanda *VLEN specifică numărul de operaŃii efectuate precum şi incrementul. Comanda *VMASK permite efectuarea parŃială numai a unor rânduri funcŃie de un alt vector care conŃine elemente 0 şi 1 în poziŃiile care trebuie „parcurse”.

Uneori este util ca parametri care intră în operaŃie (sau chiar rezultatul) să fie folosiŃi cu valoarea lor absolută, pentru aceasta se activează funcŃia *VABS. Dacă parametri trebuie să fie multiplicaŃi cu un factor atunci se poate folosi funcŃia *VFACT. Dacă trebuie executată o comandă de genul

ParR = ParR + ParR(Precedent),

atunci se poate folosi opŃiunea funcŃiei *VCUM. Pentru a obŃine anumite proprietăŃi ale unui vector Par1 se poate utiliza funcŃia cu sintaxa:

*VSCFUN, ParR, Func, Par1 în care

ParR este un parametru scalar, iar Func poate să fie

MAX,

MIN, LMAX, LMIN (indexul de localizare), FIRST, LAST (indexul primei/ultimei valori nenule din vector), SUM (suma elementelor vectorului), MEDI (valoarea de mijloc), MEAN ( adică (σ Par1)/NUM, unde NUM este numărul valorilor însumate), VARI (σ ((Par1-MEAN)**2))/NUM,

Page 13: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

STDV (deviaŃia standard: radical din VARI), RMS (Root-mean-square: radical din (σ (Par1**2))/NUM), NUM (Numărul valorilor adunate –valorile mascate nu sunt numărate).

Cu comanda *VITRP se poate extrage o matrice de tip vector dintr-o matrice de tip tabel prin interpolare liniară. Exemplele următoare prezintă modul de lucru ale funcŃiilor enumerate mai sus. Se consideră că parametrii următori sunt deja definiŃi (X şi Y ar pute fi definiŃi cu comenzile de mai jos)

*DIM,X,ARRAY,4,4 *VFILL,X(1,1),DATA,-2,1,4,-8 *VFILL,X(1,2),DATA,6,0,-3,1 *VFILL,X(1,3),DATA,8,2,-1,10 *VFILL,X(1,4),DATA,0,12,7,-5

*DIM,Y,ARRAY,4,4 *VFILL,Y(1,1),DATA,3,-5,8,1 *VFILL,Y(1,2),DATA,2,-7,0,4 *VFILL,Y(1,3),DATA,5,1,0,9 *VFILL,Y(1,4),DATA,-6,0,11,16

−−

−−

=

51018

7134

12201

0862

X

−−

=

16941

11008

0175

6523

Y

=

90

75

60

45

30

15

0

THETA

Pentru început se defineşte un vector Z1 care este rezultatul adunării coloanei 2 din X cu coloana 1 din Y. Pentru acesta se execută comenzile *DIM,Z1,ARRAY,4 *VOPER,Z1(1),X(1,2),ADD,Y(1,1) care conduc la rezultatul:

=

2

5

5

9

1Z .

În exemplul următor se înmulŃeşte prima coloană din X (începând cu rândul 2) cu a patra coloană din Y (începând cu rândul 1) şi se salvează rezultatele în vectorul Z2 începând cu rândul 1: *DIM,Z2,ARRAY,3 *VOPER,Z2(1),X(2,1),MULT,Y(1,4) Rezultatul este:

=

88

0

6

2Z

Pentru comenzile în care se implică operaŃii matriceale:

Page 14: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

*DIM,Z3,ARRAY,4,4,1, , , *MOPER,Z3(1,1),X(1,1),MULT,Y(1,1)

se obŃine

−−

−−

=

78844346

77805726

2081135031

10044628

3Z .

În următorul exemplu se dimensionează mai întâi matricea Z4 şi apoi se execută produsul vectorial pentru patru perechi de vectori. Componentele i, j şi k a acestor vectori sunt coloanele 1, 2 şi 3 din X şi coloanele 2, 3 şi 4 din Y. Aceste rezultate sunt scrise în matricea Z4, pentru care componentele i, j şi k sunt vectorii din coloanele 1, 2 şi 3. *DIM,Z4,ARRAY,4,3 *VOPER,Z4(1,1),X(1,1),CROSS,Y(1,2)

−−

−−

−−

−−

=

7616874

04433

1142

22476

4Z

Pentru prima pereche de vectori: -2i+6j+8k şi 2i+5j-6k, rezultă prima linie, adică

k22j4i76

652

862

kji

−+−=

− .

Comenzile de mai jos execută: se dimensionează matricea A4; se setează interpretarea unghiurilor în grade; se calculează în prima coloană cosinus de theta, apoi în coloana următoare sinus de theta, iar în ultima coloană se atribuie valori constante egale cu 2. În această situaŃie variabila A4 reprezintă un arc de cerc de rază 1 reprezentat prin 7 puncte echidistante care se află în planul z=2. *DIM,A4,ARRAY,7,3 *AFUN,DEG *VFUN,A4(1,1),COS,THETA(1) *VFUN,A4(1,2),SIN,THETA(1) A4(1,3)=2,2,2,2,2,2,2 OperaŃiile matriceale se efectuează cu comanda *MOPER care are sintaxa:

*MOPER, ParR, Par1, Oper, Par2, Par3, kDim, --, kOut în care argumentele au semnificaŃia: ParR – numele parametrului în care se stochează rezultatele; Par1 – primul parametru de intrare implicat în operaŃie. Pentru unele operaŃii cum ar fi MAP, acesta trebuie să să aibă dimensiunea N x 3 , adică coordonatele pentru care se doreşte a fi efectuată interpolarea, iar ParR rezultă de dimensiune N(out) x M şi conŃine valorile interpolate; Oper - operaŃia matriceală, care poate fi:

INVERT (inversarea unei matrice pătratice); MULT (înmulŃire de matrice); COVAR (covarianŃa); CORR (coeficienŃii de corelaŃie);

Page 15: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

SOLV (rezolvarea unui sistem de ecuaŃii liniar, se rezolvă unsistem de n ecuaŃii cu n necunoscute de forma an1x1 + an2x2 + ... + annxn = bn unde Par1 conŃine matricea coeficienŃilor a, Par2 vectorul sau vectorii valorilor b, şi ParR este vectorul sau vectorii necunoscutelor x;

SORT, NNEAR (determinarea rapidă a celor mai apropiate noduri faŃă de vectorul Par1 a

coordonatelor n x 3; ENEAR (cel mai apropiat element faŃă de un vector de coordonate); MAP (proiectarea unor rezultate dintr-un program în altul, un fel de interpolare)

Par2 – al doilea parametru implicat în operaŃii Par3 - al treilea parametru implicat în operaŃii kDim - criteriul de interpolare utilizat în MAP (pe o suprafaŃă sau pe un volum) kOut – criteriul de interpolare în afara regiunii declarate Toate operaŃiile cu vectori şi matrice sunt afectaŃi de specificaŃiile din anumite comenzi cum ar fi: *VCUM (soluŃie cumulativă), *VABS (se lucrează cu valori absolute), *VFACT (se scalează cu un factor), *VLEN (numărul de rânduri implicate în operaŃie), *VCOL (numărul de coloane implicat în operaŃie), and*VMASK (selectarea parŃială) şi care sunt resetate la implicit după fiecare operaŃie cu vectori şi matrice. Starea curentă a specificaŃiilor se poate afla cu *VSTAT. Se precizează că funcŃiile de specificaŃie devin active doar atunci când operaŃiile implicate permit acest lucru. Vectorii se pot reprezenta grafic utilizând comanda *VPLOT. Eticheta axei ordonatelor se poate modifica cu comanda /GCOLUMN. 1.1.8. Limbajul APDL utilizat în macrouri

O serie de comenzi frecvente se pot salva într-un fişier şi apoi se pot apela ori de câte ori este nevoie printr-o comandă similară celor din ANSYS. Această listă de comenzi poartă numele de “macrou”. Macrourile pot să conŃină (includă) alte macrouri, adică un macou poate să apeleze alt macrou şi aşa mai departe. Se pot utiliza până la 20 de nivele de includere.

Fig. 1.2: Geometria parametrică unui nit, în macroul nit_1.mac

Page 16: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Un exemplu de macrou care defineşte un nit (în /prep7) în planul de lucru curent, cu axa nitului pe direcŃia Z şi centul nitului chiar in originea planului de lucru (vezi Fig. 1.2) este: !* VERSIUNEA 1.0 STEFAN SOROHAN 01/06/2007

!* MACROUL DEFINESTE UN NIT PLIN CU CAP TRONCONIC DE GEOMETRIE:

!* DIAMETRU D = ARG1

!* LUNGIME PARTE CILINDRICA L = ARG2

!* DIAMETRU MAX A CAPULUI DE NIT DC = ARG3

!* INALTIMEA CAPULUI DE NIT H = ARG4

/NOPR ! SE SUPRIMA PRINTAREA COMENZILOR DIN MACROU

!* VERIFICAREA SI CORECTIA DATELOR DE INTRARE

*IF,ARG1,LE,0,THEN

ARG1=1 ! implicit diametrul nitului este 1

*MSG, NOTE, 'NIT',1,1,2,0.75

DIAMETRU ( %C) = %I, LUNGIME = %G, DIAM CAP NIT = %G, INALTIME CAP

NIT = %G

*ENDIF

*IF,ARG2,LE,0,THEN

ARG2=ARG1

*ENDIF

*IF,ARG3,LE,0,THEN

ARG3=2*ARG1

*ENDIF

*IF,ARG4,LE,0,THEN

ARG4=0.75*ARG1

*ENDIF

*IF,DC,LE,D,THEN

ARG3=2*ARG1

*ENDIF

VSEL,U,,,ALL ! DESELECTAREA TUTUROR VOLUMELOR

!* CREAREA NITULUI

CYLIND,ARG1/2, ,-ARG2/2,ARG2/2,0,360,

CONE,ARG3/2,ARG1/2,ARG2/2,ARG2/2+ARG4,0,360,

CONE,ARG1/2,ARG3/2,-ARG2/2-ARG4,-ARG2/2,0,360,

VADD,ALL ! ADUNAREA CELOR TREI VOLUME DEFINITE

VSEL,S,,,ALL ! SELECTAREA TUTUROR VOLUMELOR

/GO ! IN CONTINUARE SE SCRIU (AFISEAZA) COMENZILE

Dacă acest macrou este salvat în fişierul nit_1.mac atunci el se poate apela cu comanda: *USE,NIT_1 sau, deoarece extensia este mac, prin simpla apelare NIT_1 în acesta variantă de apelare se obŃine un nit cu dimensiunile predefinite în macrou, adică D = 1; L = 1, Dc = 2; H = 0,75, dacă spre exemplu se doreşte obŃinerea unui nit cu dimensiunile

Page 17: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

D = 2; L = 3, Dc = 4; H = 1 atunci se foloseşte comanda: NIT_1,2,3,4,1 Macrourile se pot crea în ANSYS sau se pot utiliza o serie de editoare text (wordpad de exemplu) în care se “scriu” comenzi. Macrourile trebuie să nu fie denumite identic cu numele comenzilor ANSYS, sau să înceapă cu primele 4 caractere ale unei comenzi ANSYS deoarece atunci programul execută o comandă internă şi nu macroul. Numele fişierului macrou nu trebuie să depăşească 32 de caractere, nu poate să înceapă cu un număr, extensia nu poate să fie mai lungă decât 8 caractere (dacă se doreşte apelarea prin numele fişierului această extensie trebuie să fie .MAC). Se recomandă totuşi evitarea utilizării de extensii .mac deoarece acestea sunt folosite de regulă pentru macrourile predefinite ale programului ANSYS. Atunci când se execută un macrou cu extensia mac, ordinea de căutare a numelui fişierului este: 1. directorul /ansys_inc/v100/ansys/apdl; 2. directoarele specificate în ANSYS_MACROLIB; 3. directorul specificat prin $HOME; 4. directorul de lucru. În interiorul programului ANSYS un macrou se poate crea prin patru metode: -1. folosind comanda *CREATE, dar astfel valorile unor parametri trebuie declarate în fişierul macro şi se pot schimba la apelare; -2. folosind comenzile *CFOPEN, *CFWRITE şi *CFCLOS, în acest fel se rezolvă problema parametrilor; -3. folosind comanda /TEE în linia de comandă care scrie o listă de comenzi într-un fişier odată cu executarea unor comenzi, astfel parametrii se utilizează cu valoarea lor curentă, dar în fişierul creat nu se rezolvă problema parametrilor, care se înregistrează cu numele lor; -4. folosind Utility Menu> Macro> Create Macro. Această metodă deschide o fereastră dialog în care se crează un macro, dar nici astfel nu se rezolvă complet problema parametrilor. Este posibil a introduce mai multe macrouri într-un singur fişier. În acest fel pot fi create biblioteci de macrouri. Fişierul nu trebuie să aibă o extensie explicită şi are structura de forma: MACRONAME1 . . /EOF MACRONAME2 . . /EOF MACRONAME3 . . ./EOF Orice macrou se poate executa prin apelare cu comanda *USE. De exemplu apelarea macroului MYMACRO (fără extensie) care este salvat undeva în zona de căutare a programului ANSYS se dă comanda:

*USE,MYMACRO în acest fel, macroul nu are argumente. Dacă acest macrou este salvat în alt director: /myaccount/macros şi are numele MYMACRO.MACRO se apelează cu: *USE,/MYACCOUNT/MACROS/MYMACRO.MACRO

Page 18: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Dacă macroul are extensia .mac şi se află salvat în zona de căutare a programului, atunci execuŃia lui constă în simpla apelare din linia de comandă MYMACRO Dacă macroul are argumente, acestea urmează imediat după numele de apelare, şi sunt încadrate de virgule, adică MYMACRO,4,3,2,1.5 sau *USE,MYMACRO.MAC,4,3,2,1.5 Utilizarea macrourilor salvate într-o bibliotecă de macrouri, se face similar cu deosebirea că înainte de apelare se specifică (selectează) fişierul în care este salvat macroul respectiv folosind comanda *ULIB. De exemplu dacă macroul se află în fişierul mymacros.mlib din directorul the /myaccount/macros, atunci comanda este: *ULIB,MYMACROS,MLIB,/MYACCOUNT/MACROS/ Limbajul APDL permite două seturi de parametri scalari care pot fi folositi ca variabile locale. Acestea sunt:

• Un set de parametri de atribuire care se apelează odată cu macroul; • O serie de parametri care sunt folosiŃi şi sunt vizibili numai în interiorul macroului.

Parametri de atribuire sunt predefiniŃi şi sunt în număr de maxim 19. Aceşti parametri pot fi refolosiŃi în macrouri care apelează alte macrouri, deoarece de fiecare dată aceşti parametri sunt locali. Parametrii au nume predefinite, de la ARG1 până la AR19 şi pot fi utilizaŃi ca numere, caractere alfanumerice (de lungime maximă 8 caractere şi încadrate între apostroafe), parametri numerici sau tip CHAR şi expresii parametrice. De exemplu, următorul macrou (mymacro.mac) necesită introducerea a patru argumente: ARG1, ARG2, ARG3 şi ARG4: /PREP7 /VIEW,,-1,-2,-3 BLOCK,,ARG1,,ARG2,,ARG3 SPHERE,ARG4 VSBV,1,2 FINISH

Pentru a executa acest macrou, un utilizator trebuie să-l apeleze cu comanda: MYMACRO,4,3,2.2,1 Fiecare macrou poate avea până la 79 de parametrii scalari utilizaŃi ca variabile locale (AR20 până la AR99). Aceşti parametrii sunt complet locali şi nu pot fi transmişi dintr-un macrou în altul decât prin folosirea comenzii /INPUT sau a unui ciclu "do loop" în interiorul unui macrou. Pe lângă parametri locali din fiecare macrou, programul ANSYS are un set de parametrii scalari predefiniŃi ARG1 până la AR99 care sunt locali într-un fişier de intrare şi nu se suprapun cu cei din interiorul fiecărui macrou. 1.1.9. SecvenŃa de execuŃie a unui program în APDL

Atunci când programul execută comenzile dintr-un fişier, acestea sunt executate în ordinea în care apar, totuşi sunt o serie de comenzi care permit dirijarea execuŃiei unor comenzi. Aceste comenzi sunt: apelarea subrutinelor (macrourilor); execuŃia unei comenzi de salt condiŃionat (*IF) sau chiar necondiŃionat (GOTO) şi execuŃia repetată a unei comenzi cu incrementare.

Page 19: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Limbajul APDL permite până la 20 de nivele de apelare în “adâncime”, adică un macrou lansat apelează alt macrou şi aşa mai departe. D exemplu într-o bibliotecă de macrouri macroul MYSTART apelează macroul MYSPHERE pentru a crea o sferă: MYSTART /PREP7 /VIEW,,-1,-2,-3 MYSPHERE,1.2 FINISH /EOF MYSPHERE SPHERE,ARG1 /EOF Cea mai simplă comandă de salt necondiŃionat este *GO, de exemplu secvenŃa de instrucŃiuni de mai jos arată utilizarea comenzii. *GO,:BRANCH1 --- ! Acest bloc de comenzi nu se execută --- :BRANCH1 --- --- Eticheta specificată prin comanda *GO trebuie să înceapă cu (:) şi să nu conŃină mai mult de 8 caractere inclusiv cele două puncte. Limbajul APDL permite executarea unui set alternativ de blocuri pe baza evaluării unei condiŃii prin comanda *IF. Comanda *IF are următoarea sintaxă:

*IF, VAL1, Oper, VAL2, Base în care VAL1 este primul parametru în comparaŃie; Oper este operatorul de comparaŃie; Operatorii de comparaŃie sunt:

EQ (egal); NE (diferit); LT (mai mic decât); GT (mai mare decât); LE (mai mic sau egal); GE (mai mare sau egal); ABLT (mai mic în valori absolute); ABGT (mai mare în valori absolute).

VAL2 este al doilea parametru în operaŃie; Base este acŃiunea care urmează a fi executată dacă evaluarea este adevărată. Dacă argumentul Base ia valoarea THEN atunci comanda *IF se transformă într-o comandă if-then-else (similară programului FORTRAN). ConstrucŃia completă este

• O comandă *IF urmată de • Una sau mai multe comenzi *ELSEIF • O comandă opŃională *ELSE • O comandă obligatorie *ENDIF care marchează sfârşitul construcŃiei.

În combinaŃie comanda *IF poate lucra ca o funcŃie CASE în alte limbaje. Dacă argumentul Base ia valoarea STOP, se iese din program. Uneori pentru ştergerea parametrilor se foloseşte comanda /CLEAR, care poate şterge şi parametrii de control a instrucŃiunii de decizie, deci se impune mare atenŃie în manipularea parametrilor.

Page 20: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

1.1.10. Repetarea comenzilor, cicluri Cea mai simplă comandă de repetare este comanda *REPEAT. Aceasta permite executarea comenzii precedente de un număr de ori, prin simpla incrementare cu o constantă a unor câmpuri Exemplul de mai jos de creare a unor elemente de tip linie, este foarte sugestiv E,1,2 *REPEAT,5,0,1 acest şir de comenzi execută prin comanda E,1,2 un element între nodurile 1 şi 2, apoi comanda *REPEAT mai generează 4 elemente (numărul 5 include şi comanda iniŃială) rezultând în final elementele definite de nodurile: 1-2, 1-3, 1-4, 1-5 şi 1-6. Se menŃionează că majoritatea comenzilor care încep cu / sau * (cu excepŃia celor de grafică) nu pot fi repetate cu comanda *REPEAT. Comenzile *DO pot executa o serie de comenzi de un număr specificat de ori. Comenzile *DO şi *ENDDO încadrează începutul şi sfârşitul unui ciclu. Sintaxa comenzii este:

*DO, Par, IVAL, FVAL, INC în care Par este parametrul utilizat în indexarea ciclului; IVAL, FVAL, INC reprezintă valoarea iniŃială, finală şi pasul a parametrului. Pasul nu poate fi negativ şi trebuie să fie număr întreg. Următorul exemplu, editează cinci cazuri de încărcare şi face unele schimbări în fiecare dintre ele: *DO,I,1,5 ! For I = 1 to 5: LSREAD,I ! Citeşte cazul de încărcare I OUTPR,ALL,NONE ! Schimbă parametrii de control pentru OUTPUT ERESX,NO ! Nu se extrapoleaza tensiunile la noduri LSWRITE,I ! Rescrie cazul de încărcare I *ENDDO În interiorul ciclurilor pot fi utilizate comenzile *IF, *EXIT sau *CYCLE. Regulile de bază ale programării structurate este bine a fi folosite şi în cadrul programului ANSYS. Există şi o formă indirectă de a executa comenzi tip ciclu prin utilizarea a două puncte ca în Matlab. Această convenŃie execută mai rapid comenzile deoarece se face direct în memorie. Sintaxa directă este: (x:y:z) în care z implicit este 1 dacă nu este specificat. De exemplu comanda N,(1:6),(2:12:2) execută acelaşi lucru cu seria de comenzi: N,1,2 N,2,4 N,3,6 . . . N,6,12 Se menŃionează că cea mai scurtă expresie controlează execuŃia ciclului. De exemplu comanda N,(1:7),(2:12:2) are acelaşi efect ca precedenta. Alte comenzi care se pot folosi sunt *DOWHILE (repetă până când un parametru extern se modifică). 1.1.11. Parametri _STATUS şi _RETURN în Macrouri

Page 21: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Programul ANSYS generează doi parametri interni _STATUS şi _RETURN care pot fi folosiŃi în macrouri. De exemplu funcŃiile de modelare solidă generează parametrul _RETURN care conŃine rezultatul executării funcŃiei. De exemplu executarea unei comenzi de generare a unui Keypoint cu comanda K atribuie parametrului _RETURN numărul acelui Keypoint. ExecuŃia unei comenzi oarecare (inclusiv un macro) generează parametrul _STATUS. Acest parametru prin valoarea lui reflectă starea executării, adică:

0 (fără eroare); 1 (o notă explicativă); 2 (un warning); 3 (cu eroare).

1.1.12. Exemple simple de macrouri

Primul exemplu de macrou numit offset.mac, deplasează setul nodurilor selectate în cadrul preprocesorului PREP7. Acest macrou este prezentat numai din considerente demonstrative deoarece comanda NGEN este mai eficientă. Deoarece toate comenzile inclusiv comentariile unor macrouri predefinite sunt în limba engleză, următorul exemplu se prezintă aşa cum este descris în manualul APDL din ANSYS: ! Macro to offset selected nodes in PREP7

! The below file is saved as: offset.mac

! Usage: OFFSET,DX,DY,DZ

/NOP ! suppress printout for this macro

*GET,NNODE,NODE,,NUM,MAX ! get number of nodes

*DIM,X,,NNODE ! set up arrays for node locations

*DIM,Y,,NNODE

*DIM,Z,,NNODE

*DIM,SEL,,NNODE ! set up array for select vector

*VGET,X(1),NODE,1,LOC,X ! get coordinates

*VGET,Y(1),NODE,1,LOC,Y

*VGET,Z(1),NODE,1,LOC,Z

*VGET,SEL(1),NODE,1,NSEL ! get selected set

*VOPER,X(1),X(1),ADD,ARG1 ! offset locations

*VOPER,Y(1),Y(1),ADD,ARG2

*VOPER,Z(1),Z(1),ADD,ARG3

! *DO,I,1,NNODE ! store new positions

! *IF,SEL(I),GT,0,THEN ! this form takes 98 sec for 100,000 nodes

! N,I,X(I),Y(I),Z(I)

! *ENDIF

! *ENDDO

*VMASK,SEL(1) ! takes 3 seconds for 100,000 nodes

N,(1:NNODE),X(1:NNODE),Y(1:NNODE),Z(1:NNODE)

X(1) = ! delete parameters (cleanup)

Page 22: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Y(1) =

Z(1) =

SEL(1) =

I=

NNODE=

/GO ! resume printout

Cel de-al doilea exemplu numit bilinear.mac, evaluează tensiunile dintr-un model deja rulat static şi atribuie materialul 1 elementelor supuse la întindere şi materialul 2 elementelor supuse la compresiune (aceste două materiale trebuie să fie deja definite în model şi pot avea proprietăŃi diferite la întindere şi compresiune) apoi mai rulează problema pentru a corecta eventual selecŃia elementelor şi soluŃia problemei. Acest macrou este util a fi rulat după rezolvarea unei analize statice. ARG1 este numărul de iteraŃii (implicit este 2). /nop

_niter = arg1 ! set number of iterations

*if,_niter,lt,2,then

_Niter = 2

*endif

*do,iter,1,_niter ! loop on number of iterations

/post1

set,1,1

*get,ar11,elem,,num,maxd ! Get number of elements

*dim,_s1,,ar11 ! array for element s1

*dim,_s3,,ar11 ! array for element s3

etable,sigmax,s,1 ! s1 is in element table sigmax

etable,sigmin,s,3 ! s3 is in element table sigmin

*vget,_s1(1),elem,1,etab,sigmax ! get element maximum stress in

s1

*vget,_s3(1),elem,1,etab,sigmin ! get element minimum stress in

s3

*dim,_mask,,ar11 ! array for mask vector

*voper,_mask(1),_s1(1),lt,0 ! true if max. stress &lt; 0

*vcum,1 ! accumulate compression elements

*vabs,0,1 ! absolute value of s3

*voper,_mask(1),_s3(1),gt,_s1(1) ! true if abs(minstr) > maxstr

finish

/prep7 ! go to prep7 for element

material mods

mat,1 ! set all materials to tension

properties

emod,all

*vput,_mask(1),elem,1,esel ! select compression elements

mat,2 ! change selected elements to compression

emod,all

esel,all ! select all elements

finish

_s1(1)= ! clean up all vectors (set to zero)

_s3(1)=

_mask(1)=

Page 23: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

/solve ! rerun the analysis

solve

finish

*enddo ! end of iterations

_niter= ! clean up iteration counters

_iter=

/gop

1.1.13. Aspecte de interfaŃă în lucrul GUI

Atunci când se rulează un macrou în modul de lucru GUI, programul ANSYS asigură o serie de facilităŃi suplimentare pentru lucrul cu macrouri. Astfel este posibil să: • Se introducă un parametru scalar de la tastatură folosind comanda *ASK; • Se creeze o fereastră de dialog pentru a introduce mai multe valori pentru o serie de

parametri; • Se afişeze un mesaj folosind comanda *MSG; • Se selecteze anumite entităŃi cu ajutorul mousului; • Se deschidă orice fereastră de dialog. InformaŃii suplimentare legate de comenzile care lucrează cu parametri se găsesc în manualul APDL Programmer's Guide.

Page 24: Prezentarea unui program cu elemente finite capabil a fi folosit în ...

Exemplu simplu de optimizare pentru o grindă în consolă