Prezentarea unui program cu elemente finite capabil a fi folosit în ...
Prezentarea unui program cu elemente finite capabil a fi folosit în ...
Prezentarea unui program cu elemente finite capabil a fi folosit în ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Lab. 01. <strong>Prezentarea</strong> <strong>unui</strong> <strong>program</strong> <strong>cu</strong> <strong>elemente</strong> <strong><strong>fi</strong>nite</strong> <strong>capabil</strong> a <strong>fi</strong> <strong>folosit</strong> în<br />
analiza de optimizare. Exemplu simplu de optimizare pentru o grindă în<br />
consolă<br />
Ghid de modelare parametrică 3D<br />
Orice <strong>program</strong> <strong>cu</strong> <strong>elemente</strong> <strong><strong>fi</strong>nite</strong> comercial este un produs exe<strong>cu</strong>tabil obŃinut prin<br />
compilarea <strong>unui</strong> text sursă dezvoltat în medii de <strong>program</strong>are gen Fortran, C, Visual Basic, etc.<br />
Pentru a <strong>fi</strong> un produs flexibil de regulă aceste <strong>program</strong>e sunt concepute în forma unor<br />
comenzi de generare a geometriei, rezolvare a problemei şi vizualizarea rezultatelor. Aceste<br />
comenzi parti<strong>cu</strong>larizate constituie practic un alt limbaj de <strong>program</strong>are propriu <strong>program</strong>ului <strong>cu</strong><br />
<strong>elemente</strong> <strong><strong>fi</strong>nite</strong>. Pentru a spori viteza de lucru a utilizatorului, în momentul de faŃă <strong>program</strong>ele<br />
accesează comenzile interne prin intermediul unor <strong>program</strong>e de interfaŃă gra<strong>fi</strong>că. Astfel<br />
utilizatorul utilizează de regulă mouse-ul şi tastatura <strong>cu</strong> cifre. În ANSYS acest mod de lucru<br />
se numeşte GUI (Graphic User Interface). Utilizatorii experimentaŃi pot utiliza comenzile<br />
ANSYS care se introduc prin linia de comandă. De regulă <strong>program</strong>ele monitorizează toate<br />
comenzile utilizatorului într-un <strong>fi</strong>şier text (în ANSYS numit log) care poate <strong>fi</strong> eventual<br />
re<strong>folosit</strong>.<br />
1.1. Introducere în limbajul de <strong>program</strong>are parametrică din ANSYS<br />
Programul ANSYS a fost conceput să poată <strong>fi</strong> utilizat şi prin intermediul <strong>unui</strong> limbaj<br />
de <strong>program</strong>are parametrică APDL (ANSYS Parametric Design Language). Acesta permite<br />
utilizarea comenzilor de generare a modelului din <strong>program</strong>ul <strong>cu</strong> <strong>elemente</strong> <strong><strong>fi</strong>nite</strong> în termenii<br />
unor parametri (variabile). Deasemenea o serie de rezultate pot <strong>fi</strong> extrase prin intermediul<br />
unor parametri şi utilizate pentru a obŃine o serie de funcŃii necesare în special în modulul de<br />
optimizare. Descrierea parametrică a unor comenzi echivalează <strong>cu</strong> crearea unor funcŃii<br />
utilizator care pot <strong>fi</strong> utilizate pentru o clasă largă de aplicaŃii similare, adică spre exemplu<br />
dacă modelul unei structuri variază în raport <strong>cu</strong> o serie de parametri, odată creat un singur<br />
model parametric, celelalte modele geometrice se pot obŃine din acesta printr-o apelare a<br />
funcŃiei create <strong>cu</strong> parametrii actuali. Uneori este necesară repetarea unor comenzi (do-loops)<br />
sau introducerea unor blo<strong>cu</strong>ri de decizie (if-then-else), sau utilizarea unor operaŃii vectoriale<br />
sau matriceale (înmulŃiri, inversări de matrice). Toate acestea se pot efectua <strong>cu</strong> ajutorul<br />
acestui limbaj intern de <strong>program</strong>are.<br />
APDL stă la baza utilizării algoritmilor de optimizare şi discretizare adaptivă şi oferă<br />
avantaje chiar şi pentru modelarea unei structuri singulare, deoarece spre exemplu o serie de<br />
mărimi care conŃin multe caractere (zecimale), sau care se obŃin prin operaŃii algebrice simple,<br />
pot <strong>fi</strong> declarate o singură dată şi apoi pot <strong>fi</strong> <strong>folosit</strong>e de mai multe ori.<br />
În acest ghid se descriu o serie de facilităŃi ale APDL <strong>cu</strong>m ar <strong>fi</strong> parametri, macrouri,<br />
blo<strong>cu</strong>ri de decizie, cicluri, parametri tip matrice. Pentru exempli<strong>fi</strong>care se prezintă o serie de<br />
exemple prezentate în helpul <strong>program</strong>ului ANSYS pre<strong>cu</strong>m şi o serie de aplicaŃii create pentru<br />
lărgirea şi exempli<strong>fi</strong>carea prezentării. Nu se insistă pe comenzile <strong>program</strong>ului ANSYS, care<br />
sunt în număr de câteva mii, ci pe modul în care aceste comenzi pot <strong>fi</strong> utilizate prin<br />
intermediul unor parametri de<strong>fi</strong>niti de utilizator. Totuşi, o serie de comenzi, care folosesc la<br />
de<strong>fi</strong>nirea şi lucrul <strong>cu</strong> parametri, se prezintă complet.<br />
1.1.1. Utilizarea parametrilor
Parametri sunt variabile APDL (ei sunt similari variabilelor din Fortran). Aceştia nu<br />
trebuie declaraŃi ca tip (intregi, reali, etc). Toate variabilele intregi sau reale sunt alocate în<br />
dublă precizie. Parametri utilizaŃi fără a <strong>fi</strong> iniŃializaŃi sunt automat setaŃi la o valoare foarte<br />
mică, practic zero, adică aproximativ 2 -100 . ANSYS utilizează două tipuri de parametri: scalari<br />
şi matrice (array).<br />
Variabile de tip şir de caractere (de lungime maximă opt caractere) pot <strong>fi</strong> atribuite unor<br />
parametri prin simpla încadrare între apostroafe simple. Pentru tipul array APDL permite<br />
câteva tipuri parti<strong>cu</strong>lare de variabile şi anume: numerice, caracter, şir şi tabel (table). Aceastea<br />
din urmă folosesc la obŃinerea unor valori interpolate liniar, de exemplu la de<strong>fi</strong>nirea unei<br />
încărcări <strong>cu</strong> variaŃie în timp.<br />
Un parametru poate înlo<strong>cu</strong>i argumentul unei comenzi ANSYS oarecare <strong>cu</strong> condiŃia să<br />
<strong>fi</strong>e de<strong>fi</strong>nit anterior la valoarea dorită de utilizator şi acceptată de <strong>program</strong>.<br />
1.1.2. Reguli de atribuire a numelor parametrilor<br />
Parametrii trebuie să: înceapă <strong>cu</strong> o literă; să conŃină numai litere, numere şi caracterul<br />
underscore (liniuŃă jos); să nu conŃină mai mult de 32 de caractere. Exemple de parametri<br />
valizi sunt:<br />
A1, A2345, PI, A_1 etc.<br />
Exemple de parametri greşit de<strong>fi</strong>niŃi sunt:<br />
1A, A&B etc.<br />
Se precizează că limbajul ANSYS nu este case sensitive, adică atât parametri cât şi<br />
comenzile pot <strong>fi</strong> apelate <strong>fi</strong>e <strong>cu</strong> litere mari, sau mici <strong>fi</strong>e <strong>cu</strong> litere combinate.<br />
Se recomandă ca parametrii de<strong>fi</strong>niŃi de utilizator să nu coincidă <strong>cu</strong> o serie de nume gen<br />
etichetă (label) din ANSYS <strong>cu</strong>m ar <strong>fi</strong>: DOF, TEMP, UX, PRES, ALL, PICK, STAT, CHAR,<br />
ARRAY, TABLE etc. O serie de alŃi parametri numiŃi ARG1 până la ARG9 şi AR10 până la<br />
AR99 sunt rezervaŃi pentru parametri locali din macrouri. Deasemenea nu se recomandă<br />
utilizarea numelor atribuite unor funcŃii de pres<strong>cu</strong>rtare (adică de<strong>fi</strong>niŃi prin comanda ANSYS<br />
*ABBR) pre<strong>cu</strong>m şi a parametrilor care încep <strong>cu</strong> caracterul liniuŃă jos, adică _A1 de exemplu,<br />
deoarece aceştia sunt rezervaŃi pentru lucru intern al <strong>program</strong>ului.<br />
1.1.3. De<strong>fi</strong>nirea parametrilor<br />
În continuare, dacă nu se speci<strong>fi</strong>că, parametri de<strong>fi</strong>niŃi pot <strong>fi</strong> atribuiŃi atât variabilelor<br />
scalari cât şi array. Parametrii pot <strong>fi</strong> speci<strong>fi</strong>caŃi explicit, sau pot <strong>fi</strong> extraşi din baza de date a<br />
<strong>program</strong>ului ANSYS folosind funcŃia complexă *GET.<br />
Atribuirea valorilor unor parameteri se poate face <strong>cu</strong> comanda *SET sau direct<br />
folosind caracterul =, de exemplu comenzile de mai jos sunt echivalente<br />
*SET,A1,-24<br />
A1=-24<br />
*SET,grosime,2.07E-3<br />
Grosime=2.07E-3<br />
*SET,A2,A1<br />
A2=A1<br />
*SET,CPARM,'CASE1'<br />
CPARM='CASE1'<br />
ObŃinerea (extragerea) unor date (de intrare sau rezultate) în parametri de<strong>fi</strong>niŃi de<br />
utilizator este posibilă numai prin utilizarea funcŃiei *GET, <strong>fi</strong>e direct <strong>fi</strong>e ca argument în<br />
anumite funcŃii implicate în cal<strong>cu</strong>lul parametrilor.<br />
Comanda *GET extrage valori numerice care corespund de<strong>fi</strong>niŃiei <strong>unui</strong> nod, element,<br />
arii, volum etc şi le stochează într-un parametru de<strong>fi</strong>nit de utilizator. De exemplu comanda<br />
*GET,XG5,ELEM,5,CENT,X
atribuie parametrului XG5 coordonata centrului de greutate pe direcŃia X a elementului <strong>fi</strong>nit<br />
<strong>cu</strong> numărul 5.<br />
Comanda *GET se apelează ca o funcŃie <strong>cu</strong> o serie de parametri actuali care trebuie să<br />
<strong>fi</strong>e corect de<strong>fi</strong>niŃi pentru a obŃine ceea ce se doreşte. Formatul complet al acesteia este:<br />
*GET,Par,Entity,ENTNUM,Item1,IT1NUM,Item2,IT2NUM<br />
în care:<br />
-Par este parametrul care de<strong>fi</strong>neşte mărimea căutată;<br />
-Entity este un <strong>cu</strong>vânt cheie legat de caracteristica mărimii salvate în parametru. De<br />
exemplu NODE, ELEM, KP, LINE, AREA, VOLU, etc;<br />
-ENTNUM este numărul entităŃii sau zero pentru unele <strong>cu</strong>vinte cheie;<br />
-Item1 este numele caracteristicii unei entităŃi parti<strong>cu</strong>lare, de exemplu, dacă Entity este<br />
ELEM, Item1 poate <strong>fi</strong> <strong>fi</strong>e NUM (cel mai mic sau cel mai mare număr de element din lista de<br />
<strong>elemente</strong> selectate) sau COUNT (numărul de element din set).<br />
Comanda *GET poate <strong>fi</strong> imaginată ca o cale dintr-o structură gen arbore, de la general<br />
la o informaŃie speci<strong>fi</strong>că. Următoarele exemple prezintă câteva posibilităŃi de folosire a acestei<br />
comenzi. Prima linie extrage în parametrul MAT_E_25 materialul atribuit elementului <strong>cu</strong><br />
numărul 25:<br />
*GET,MAT_E_25,ELEM,25,ATTR,MAT MAT_E_25 = numărul elementului 25<br />
*GET,V37,ELEM,37,VOLU V37 = volumul elementului 37<br />
*GET,EL52,ELEM,52,HGEN<br />
EL52 = valoarea fluxului de căldură generat în<br />
elementul 52<br />
*GET,TMP,ELEM,16,TBULK,3 TMP = temperatura mediului ambiant pentru<br />
elementul 16 pe faŃa 3<br />
*GET,NMAX,NODE,,NUM,MAX NMAX = numărul nodului maxim din setul<br />
selectat<br />
*GET,COORD,ACTIVE,,CSYS COORD = numărul sistemului de coordonate<br />
activ<br />
Pentru unele caracteristici ale unor entităŃi parti<strong>cu</strong>lare este posibil a se utiliza o formă<br />
s<strong>cu</strong>rtă a comenzii *GET. Mai mult uneori formele s<strong>cu</strong>rte se pretează la efectuarea directă a<br />
unor operaŃii asupra parametrilor, aşa <strong>cu</strong>m se prezintă în exemplul următor. Să presupunem că<br />
se doreşte obŃinerea mediei aritmetice a coordonatelor X a două noduri <strong>cu</strong> numerele 1 şi 2.<br />
Pentru acesta se poate folosi secvenŃa de comenzi:<br />
*GET,L1,NODE,1,LOC,X<br />
*GET,L2,NODE,2,LOC,X<br />
MID=(L1+L2)/2.<br />
Metoda s<strong>cu</strong>rtă constă din apelarea<br />
MID=(NX(1)+NX(2))/2<br />
în care funcŃia „get” NX(N), întoarce coordonata X a nodului N.<br />
Argumentele funcŃiei *Get pot <strong>fi</strong> parametri sau chiar alte funcŃii get. De exemplu<br />
funcŃia<br />
NELEM(ENUM,NPOS)<br />
întoarce numărul nodului din poziŃia NPOS pentru elementul <strong>cu</strong> numărul ENUM. Se<br />
reaminteşte că nodurile <strong>unui</strong> element <strong>fi</strong>nit se numerotează I, J, K, L,... şi NPOS ia valorile 1,<br />
2, 3, 4,....Din combinaŃia funcŃiilor<br />
NX(NELEM(ENUM,NPOS))<br />
rezultă coordonata X a acelui nod solicitat de comanda precedentă.<br />
Odată de<strong>fi</strong>niŃi mai mulŃi parametri, aceştia pot <strong>fi</strong> vizualizaŃi <strong>cu</strong> comanda<br />
*STATUS.
Comanda<br />
*GET,par,PARM,,MAX<br />
întoarce numărul total de parametri de<strong>fi</strong>niŃi. În ANSYS se pot de<strong>fi</strong>ni pănă la 5000 de<br />
parametri.<br />
Pentru a şterge un parametru se poate folosi una dintre metodele de atribuire fără<br />
valoare, adică pentru a şterge parametrul A1 se pot folosi comenzile echivalente<br />
A1=<br />
*SET,A1,<br />
Uneori pentru lucrul <strong>cu</strong> <strong>fi</strong>şiere (salvare, încărcare dintr-un <strong>fi</strong>şier <strong>cu</strong> nume speci<strong>fi</strong>cat<br />
prin parametru) se impune folosirea parametrilor şir de caractere atât pentru numele <strong>fi</strong>şierelor<br />
cât şi pentru extensiile acestora. Parametri şir de caracter pot avea maximum 8 caractere. De<br />
exemplu pentru a lansa în exe<strong>cu</strong>Ńie un macrou se foloseşte comanda *USE în care argumentul<br />
este un şir de caractere alfanumeric <strong>cu</strong>m ar <strong>fi</strong>:<br />
NAME='MACRO' ! MACRO este numele <strong>fi</strong>şierului macrou<br />
*USE,NAME ! Se apelează MACRO.MAC<br />
dacă extensia <strong>fi</strong>sierului macrou este alta decât MAC atunci aceasta trebuie speci<strong>fi</strong>cată.<br />
Macroul poate <strong>fi</strong> lansat (apelat) şi direct fără a utiliza explicit comanda *USE:<br />
*SET,DEF,'SY’<br />
NEWMACRO,DEF ! Se apelează <strong>fi</strong>şierul MACROU NEWMACRO.SY<br />
Pentru a transforma o valoare numerică într-un şir de caractere, adică a a<strong>fi</strong>şa unele<br />
valori numerice, se foloseşte parametrul încadrat de semnul %. Spre exemplu dacă în titlu se<br />
doreşte a<strong>fi</strong>şarea valorii parametrului TM se foloseşte comanda:<br />
/TITLE, DISTRIBUTIA TENSIUNILOR LA TIMPUL=%TM%<br />
1.1.4. Expresii parametrice<br />
Expresiile parametrice constau în utilizarea unor operaŃii de adunare, scădere,<br />
înmulŃire, împărŃire <strong>cu</strong> parametri. De exemplu<br />
X=A+B<br />
P=(R2+R1)/2<br />
D=-B+(E**2)-(4*A*C)<br />
XYZ=(A Mai mare decât<br />
Ordinea exe<strong>cu</strong>tării operaŃiilor este cea naturală, pentru formulele complexe se folosesc<br />
parantezele. Între operatori şi variabile nu se recomandă utilizarea spaŃiilor.<br />
Sunt prede<strong><strong>fi</strong>nite</strong> următoarele funcŃii:<br />
ABS(x) Modulul lui x.
SIGN(x,y)<br />
Valoarea absolută a lui x <strong>cu</strong> semnul dat de y. Dacă y=0 semnul se<br />
consideră pozitiv<br />
EXP(x) Exponentiala lui x (e x ).<br />
LOG(x)<br />
Logaritm natural din x (ln (x)).<br />
LOG10(x)<br />
Logaritm în baza 10 din x (log 10 (x)).<br />
SQRT(x) Radical din x.<br />
NINT(x) Cel mai apropiat întreg de x.<br />
MOD(x,y) Restul împărŃirii x/y. Dacă y=0 se obŃine zero (0).<br />
RAND(x,y) Se generază numere aleatoare în domeniul x până la y (x = marginea<br />
inferioară, y = marginea superioară).<br />
GDIS(x,y)<br />
Generarea unei valori <strong>cu</strong> distribuŃie Gaussiană (normală) de medie x şi<br />
deviaŃie standard y.<br />
SIN(x), COS(x),<br />
TAN(x)<br />
Sinus, Cosinus, şi Tangenta din x. Implicit x este în radiani dar poate<br />
<strong>fi</strong> schimbată în grade <strong>cu</strong> ajutorul funcŃiei*AFUN<br />
SINH(x), COSH(x), Sinus, Cosinus şi Tangent Hiberbolic din x.<br />
TANH(x)<br />
ASIN(x), ACOS(x),<br />
ATAN(x)<br />
ATAN2(y,x)<br />
VALCHR(CPARM)<br />
CHRVAL(PARM)<br />
UPCASE(CPARM)<br />
LWCASE(CPARM)<br />
Arcsinus, Arccosinus, şi Arctangentă din x. Variabila x trebuie să <strong>fi</strong>e<br />
între -1.0 şi +1.0 pentru ASIN and ACOS. Rezultatul este în radiani<br />
dar poate <strong>fi</strong> schimbat <strong>cu</strong> *AFUN. Rezultatele sunt în intervalul -pi/2 la<br />
+pi/2 pentru ASIN şi ATAN, şi 0 la pi pentru ACOS.<br />
Arctangentă din y/x <strong>cu</strong> semnul <strong>fi</strong>ecărei componente considerate.<br />
Rezultatele sunt în domeniul -pi la +pi.<br />
Valoarea numerică a CPARM (dacă CPARM nu este numeric, se<br />
obŃine 0.0).<br />
Transformă valoarea numerică a parametrului PARM într-un şir de<br />
caractere alfanumerice<br />
Litere mari pentru parametrul CPARM.<br />
Litere mici pentru parametrul CPARM.<br />
Câteva exemple de utilizare se prezintă mai jos:<br />
PI=ACOS(-1) ! PI = 3,1415...<br />
Z3=COS(2*THETA)-Z1**2<br />
R2=SQRT(ABS(R1-3))<br />
X=RAND(-24,R2) ! X = număr aleator între -24 şi R2<br />
*AFUN,DEG ! UnităŃi de măsură pentru unghiuri în GRADE<br />
THETA=ATAN(SQRT(3)) ! THETA cal<strong>cu</strong>lat la 60 grade<br />
PHI=ATAN2(-SQRT(3),-1) ! PHI evaluat la -120 grade<br />
*AFUN,RAD ! UnităŃi de măsură pentru unghiuri resetat la RADIANI<br />
X249=NX(249) ! coordonata pe X a nodului 249<br />
SLOPE=(KY(2)-KY(1))/(KX(2)-KX(1)) ! Panta liniei dintre punctele cheie 1 şi 2<br />
CHNUM=CHRVAL(X) ! CHNUM = valoarea „caracter” a lui X<br />
UPPER=UPCASE(LABEL) ! UPPER = valoarea caracter <strong>cu</strong> litere mari a variabilei LABEL<br />
Parametrii de<strong>fi</strong>niŃi pot <strong>fi</strong> salvaŃi într-un <strong>fi</strong>şier <strong>cu</strong> comanda PARSAV şi pot <strong>fi</strong> citiŃi <strong>cu</strong><br />
comanda PARRES.<br />
1.1.5. Parametri de tip ARRAY<br />
Pe lângă parametri scalari se pot de<strong>fi</strong>ni şi parametri multipli, tip vectori sau matrice. În<br />
ANSYS aceşti parameti tip ARRAY pot <strong>fi</strong>:
• 1-D (o singură coloană)<br />
• 2-D (rânduri şi coloane)<br />
• 3-D (rânduri, coloane şi plane)<br />
• 4-D (rânduri, coloane, plane şi cărŃi)<br />
• 5-D (rânduri, coloane, plane, cărŃi şi rafturi).<br />
Programul permite trei tipuri fundamentale de parametri ARRAY:<br />
1. ARRAY. Acest tip este similar vectorilor <strong>program</strong>ului FORTRAN 77 şi este<br />
tipul implicit atunci când se dimensionează un vector. Indicii pentru rânduri, coloane si plane<br />
sunt numere conse<strong>cu</strong>tive întregi care încep <strong>cu</strong> cifra 1. Elementele vectorilor (matricelor) pot <strong>fi</strong><br />
numere reale sau întregi.<br />
2. CHAR. Acesta este un vector de caractere <strong>cu</strong> <strong>fi</strong>ecare element constând din<br />
caractere alfanumerice care nu depăşesc opt caractere. Indicii pentru rânduri, coloane si plane<br />
sunt numere conse<strong>cu</strong>tive întregi care încep <strong>cu</strong> cifra 1.<br />
3. TABLE. Aceste este un tip special de matrice <strong>cu</strong> valori numerice care<br />
permite <strong>program</strong>ului să cal<strong>cu</strong>leze prin interpolare liniară între <strong>elemente</strong>le matricei valori<br />
intermediare. Mai mult de atât, se pot de<strong>fi</strong>ni vectori de indici pentru <strong>fi</strong>ecare rând, coloană sau<br />
plan şi aceştia sunt numere reale nu întregi. Elementele matricelor pot <strong>fi</strong> numere reale sau<br />
întregi. Această structură de date permite descrierea unor funcŃii matematice.<br />
Deoarece parametrii de tip ARRAY sunt cei uzuali în toate domeniile, în continuare se<br />
insistă pe variabilele de tip TABLE (tabel).<br />
Orice tabel conŃine un rând şi o coloană de index zero. Valorile corespunzătoare<br />
acestor indecşi sunt valori reale în ordine crescătoare şi pot <strong>fi</strong> de<strong>fi</strong>niŃi <strong>cu</strong> comanda *TAXIS.<br />
Fig. 1.1 prezintă structura unei variabile de tip tabel.<br />
Fig. 1.1 Structura unei variabile de tip tabel(6,6,3)<br />
Pentru a de<strong>fi</strong>ni o variabilă de tip ARRAY, mai întâi trebuie declarat tipul şi<br />
dimensiunile parametrului utilizând comanda *DIM, aşa <strong>cu</strong>m se prezintă de exemplele de mai<br />
jos:<br />
*DIM,AA,,4 ! Tipul ARRAY este implicit, dimensiunea 4[x1x1]<br />
*DIM,XYZ,ARRAY,12 ! Tipul ARRAY, dimensiunea 12[x1x1]<br />
*DIM,FORCE,TABLE,5 ! Tipul TABLE, dimensiunea 5[x1x1]<br />
*DIM,T2,,4,3 ! Dimensiunile sunt 4x3[x1]<br />
*DIM,CPARR1,CHAR,5 ! Tipul CHAR, dimensiunea 5[x1x1]
Se menŃionează că <strong>elemente</strong>le parametrilor de tip ARRAY şi TABLE sunt iniŃializate<br />
la zero, iar parametri de tip CHAR sunt iniŃializaŃi <strong>cu</strong> valori blanc. Exemplele următoare arată<br />
<strong>cu</strong>m se pot iniŃializa valorile parametrilor de tip ARRAY şi TABLE:<br />
*DIM,XVAL,ARRAY,X1<br />
*DIM,YVAL,ARRAY,Y1<br />
YVAL(1)=0,20<br />
*DIM,ZVAL,ARRAY,10<br />
ZVAL(1)=10,20,30,40,50,60,70,80,90,100<br />
*DIM,TVAL,ARRAY,5<br />
TVAL(1)=1,.90,.80,.70,.60<br />
*DIM,TEVL,ARRAY,5<br />
TEVL(1)=1,1.20,1.30,1.60,1.80<br />
!!!! CREAZA TABEL 5D PENTRU APLICAREA PRESIUNII<br />
X1=2 !!!! DIMENSIUNE X<br />
Y1=2 !!!! DIMENSIUNE Y<br />
Z1=10 !!!! DIMENSIUNE Z<br />
D4=5 !!!! DIMENSIUNEA TIMPULUI<br />
D5=5 !!!! DIMENSIUNEA TEMPERATURII<br />
LEN=10<br />
!!!! LUNGIMEA BARE INCASTRATE<br />
WID=1<br />
!!!! LATIMEA BAREI INCASTRATE<br />
HTH=2<br />
!!!! INALTIMEA BARE INCASTRATE<br />
*DIM,XVAL,ARRAY,X1<br />
!!!! CREAZA UN VECTOR 1D PENTRU A<br />
INCARCATABELUL 5D<br />
XVAL(1)=0,20<br />
!!!! VARIATIA PE DIMENSIUNE<br />
*DIM,YVAL,ARRAY,Y1 !!!! VALORI DIFERITE PE FIECARE<br />
YVAL(1)=0,20<br />
!!!! CARTE SI RAFT<br />
*DIM,ZVAL,ARRAY,10<br />
ZVAL(1)=10,20,30,40,50,60,70,80,90,100<br />
*DIM,TVAL,ARRAY,5<br />
TVAL(1)=1,.90,.80,.70,.60<br />
*DIM,TEVL,ARRAY,5<br />
TEVL(1)=1,1.20,1.30,1.60,1.80<br />
*DIM,CCC,TAB5,X1,Y1,Z1,D4,D5,X,Y,Z,TIME,TEMP<br />
*TAXIS,CCC(1,1,1,1,1),1,0,WID<br />
!!! X-DIM<br />
*TAXIS,CCC(1,1,1,1,1),2,0,HTH<br />
!!! Y-DIM<br />
*TAXIS,CCC(1,1,1,1,1),3,1,2,3,4,5,6,7,8,9,10 !!! Z-DIM<br />
*TAXIS,CCC(1,1,1,1,1),4,0,10,20,30,40<br />
!!! TIMP<br />
*TAXIS,CCC(1,1,1,1,1),5,0,50,100,150,200 !!! TEMP<br />
*DO,II,1,2<br />
*DO,JJ,1,2<br />
*DO,KK,1,10<br />
*DO,LL,1,5<br />
*DO,MM,1,5<br />
CCC(II,JJ,KK,LL,MM)=(XVAL(II)+YVAL(JJ)+ZVAL(KK))*TVAL(LL)*TEVL(MM)<br />
*ENDDO
*ENDDO<br />
*ENDDO<br />
*ENDDO<br />
*ENDDO<br />
1.1.6. Moduri de atribuire a valorilor unor parametri ARRAY<br />
Valorile unor parametri se pot speci<strong>fi</strong>ca folosind una dintre metodele:<br />
-Se foloseşte comanda *SET pentru atribuirea individuală a <strong>elemente</strong>lor, sau<br />
forma pres<strong>cu</strong>rtată „=”;<br />
-Se utilizează comanda *VFILL pentru iniŃializare pe coloane;<br />
-Se foloseşte modul interactiv de editare utilizând *VEDIT<br />
-Se citesc valorile din <strong>fi</strong>şiere ASCII utilizând comenzile *VREAD şi<br />
*TREAD.<br />
Folosind comanda *SET (sau „=”) se pot speci<strong>fi</strong>ca până la 10 valori pe linie. De<br />
exemplu pentru a de<strong>fi</strong>ni un vector XYZ <strong>cu</strong> 12 valori se pot folosi comenzile:<br />
XYZ(1)=59.5,42.494,-9.01,-8.98,-8.98,9.01,-30.6,51<br />
XYZ(9)=-51.9,14.88,10.8,-10.8<br />
Se observă că lo<strong>cu</strong>l de unde începe completarea trebuie marcat prin indexul de rând<br />
(1) sau (9) în exemplul de mai sus.<br />
Exemplul următor arată <strong>cu</strong>m se atribuie valori <strong>unui</strong> parametru de tip ARRAY de<br />
dimensiuni 4x3 <strong>cu</strong> numele T2:<br />
T2(1,1)=.6,2,-1.8,4 ! de<strong>fi</strong>neşte (1,1),(2,1),(3,1),(4,1)<br />
T2(1,2)=7,5,9.1,62.5 ! de<strong>fi</strong>neşte (1,2),(2,2),(3,2),(4,2)<br />
T2(1,3)=2E-4,-3.5,22,.01 ! de<strong>fi</strong>neşte (1,3),(2,3),(3,3),(4,3)<br />
Dacă variabila FORCE de tip tabel de<strong>fi</strong>nită anterior este<br />
1e − 6 ⎡ 0.0 ⎤<br />
0.8<br />
⎢ ⎥<br />
⎢<br />
560.0<br />
⎥<br />
FORCE = 7.2 ⎢560.0⎥<br />
⎢ ⎥<br />
8.5 ⎢238.5⎥<br />
9.3 ⎢<br />
⎣ 0.0 ⎥<br />
⎦<br />
atunci comenzile de iniŃializare pot <strong>fi</strong>:<br />
FORCE(1)=0,560,560,238.5,0<br />
FORCE(1,0)=1E-6,.8,7.2,8.5,9.3<br />
În mod similar se pot iniŃializa şi parametri de tip CHAR, pentru exempli<strong>fi</strong>care se<br />
prezintă mai jos un exemplu:<br />
*DIM,REZULT,CHAR,3 !Vector de tip CHAR de dimensiuni (3,1,1)<br />
REZULT(1)='SX','SY','SZ' !Atribuirea valorilor variabilei RESULT<br />
Uneori este mai convenabil a se folosi comanda *VFILL pentru a iniŃializa parametri<br />
deoarece aceasta permite utilizarea unor funcŃii simple de generare. De exemplu o matrice<br />
poate <strong>fi</strong> obŃinută <strong>cu</strong> comenzile:<br />
*DIM,DTAB,ARRAY,4,3 ! dimensiune 4 x 3, matrice numerică<br />
*VFILL,DTAB(1,1),DATA,-3,8,-12,57 ! patru valori încărcate în vectorul 1<br />
*VFILL,DTAB(1,2),RAMP,2.54,2. 4 ! „umple” vectorul 2 <strong>cu</strong> valori începând<br />
<strong>cu</strong> 2.54 şi apoi incrementate <strong>cu</strong> 2.4<br />
*VFILL,DTAB(1,3),RAND,1.5,10 ! iniŃializează vectorul 3 <strong>cu</strong> valori aleatoare<br />
între 1.5 şi 10. Rezultatul variază din cauza generării aleatoare.
Lucrul interactiv este permis numai în modul de lucru interactiv, adică în GUI şi se<br />
poate efectua <strong>cu</strong> comanda *VEDIT.<br />
Parametrii de tip ARRAY pot <strong>fi</strong> citiŃi dintr-un <strong>fi</strong>şier ASCII tot în forma precizată de<br />
start din locaŃia dorită. Formatul de citire se controlează printr-un descriptor asemănător celor<br />
din FORTRAN şi trebuie să urmeze comanda de citire. Descriptorul controlează numărul<br />
câmpurilor de citit din <strong>fi</strong>ecare înregistrare, lăŃimea datelor şi poziŃia punctului zecimal.<br />
De exemplu dispunând de un <strong>fi</strong>şier numit dataval care conŃine informaŃia:<br />
1.5 7.8 12.3<br />
15.6 -45.6 42.5<br />
şi un vector <strong>cu</strong> numele EXEMPLU care are dimensiunea 2x3, următoarele comenzi<br />
*DIM,EXEMPLU,,2,3<br />
*VREAD,EXEMPLU(1,1),dataval,,,JIK,3,2<br />
(3F6.1)<br />
conduc la obŃinerea matricei<br />
⎡ 1.5 7.8 12.3⎤<br />
EXEMPLU = ⎢<br />
⎥ .<br />
⎣15.6<br />
− 45.6 42.5⎦<br />
Se menŃionează că funcŃia *VREAD nu poate <strong>fi</strong> <strong>folosit</strong>ă la citirea unor matrice 4D<br />
sau 5D.<br />
În mod similar se pot citi şi parametri de tip TABLE, folosind comanda *TREAD.<br />
FaŃă de cazul comenzii *VREAD pentru citirea parametrilor de tip ARRAY, comanda<br />
*TREAD este mai flexibilă, în sensul că nu necesită o formatare rigidă. Comanda permite ca<br />
un număr de linii iniŃiale (de comentariu) să nu <strong>fi</strong>e citite, dar dimensiunea delarată trebuie să<br />
<strong>fi</strong>e în concordantă <strong>cu</strong> numărul de linii şi coloane ale <strong>fi</strong>şierului. Valorile sunt citite pe rânduri<br />
pănă când toate coloanele din <strong>fi</strong>ecare rând sunt citite.<br />
Se presupune că este creat un <strong>fi</strong>şier ASCII <strong>cu</strong> numele "T2data.txt" care conŃine<br />
temperatura ca funcŃie de timp şi coordonata X şi se doreşte ca aceste date să <strong>fi</strong>e încărcate<br />
într-un tabel <strong>cu</strong> numele "Ttx." Tabelul în forma ASCII arată astfel:<br />
Timp<br />
Temp (timp-X-coord) Table<br />
Coordinata X<br />
0 0 .3 .5 .7 .9<br />
0 10 15 20 25 30<br />
1 15 20 25 35 40<br />
2 20 25 35 55 60<br />
4 30 40 70 90 100<br />
În ANSYS, comenzile sunt:<br />
*DIM,Ttx,table,4,5,,time,X-COORD<br />
*TREAD,Ttx,t2data,txt,,2<br />
Se poate utiliza şi comanda *VGET care este similară comenzii *GET <strong>cu</strong> deosebirea<br />
că se pot atribui mai maulte valori într-un vector. De exemplu comanda<br />
*VGET,A(1),ELEM,5,CENT,X<br />
întoarce coordonata X a elementului 5, apoi 6 şi aşa mai departe până când vectorul este<br />
complet de<strong>fi</strong>nit („umplut”).<br />
Pentru a modi<strong>fi</strong>ca anumite valori în baza de date se poate folosi comanda *VPUT care<br />
poate <strong>fi</strong> considerată opusul comenzii *VGET.
Datele din ANSYS pot <strong>fi</strong> salvate în <strong>fi</strong>şiere utilizând comanda *VWRITE care scrie<br />
maximum 10 vectori în <strong>fi</strong>şierul deschis <strong>cu</strong> comanda *CFOPEN. Formatul de scriere pentru<br />
<strong>fi</strong>ecare vector trebuie speci<strong>fi</strong>cat între paranteze imediat după comanda *VWRITE.<br />
Comenzile de formatare corespund compitatorului FORTRAN 77. De exemplu pentru<br />
descriptorul F (floating point) care este valabil pentru orice valoare numerică se foloseşte<br />
sintaxa:<br />
Fw.d<br />
în care w este lăŃimea datei în număr de caractere iar d este numărul de zecimale. Deci pentru<br />
un câmp de 10 caractere <strong>cu</strong> 8 zecimale se declară (F10.8).<br />
Pentru câmpuri de caractere se foloseşte descriptorul A, care se foloseşte <strong>cu</strong> sintaxa:<br />
Aw<br />
în care w este lăŃimea datei în număr de caractere. Pentru un parametru <strong>cu</strong> 8 caractere se<br />
foloseşte (A8).<br />
Dacă se dispune de matricea<br />
atunci secvenŃa de comenzi<br />
X=25<br />
*CFOPEN,VECTOR<br />
*VWRITE,SEQU,MYDATA(1,1,1),MYDATA(1,2,1),MYDATA(1,3,1),10.2,X,<br />
MYDATA(1,1,1)+3<br />
(F3.0,' ',F8.4,' ',F8.1,' 'F8.6,' ',F4.1,' 'F4.0,' 'F8.1)<br />
*CFCLOSE<br />
de<strong>fi</strong>neşte un parametru X de valoare 25, apoi deschide pentru scriere <strong>fi</strong>şierul VECTOR şi<br />
scrie în el un număr de odine (începând <strong>cu</strong> 1) prin <strong>cu</strong>vântul cheie SEQU şi apoi alŃi parametri<br />
speci<strong>fi</strong>caŃi. Rezultă <strong>fi</strong>sierul:<br />
1. 2.1522 3.9 5.286370 10.2 25. 5.2<br />
2. 2.3049 4.0 5.409196 10.2 25. 5.2<br />
3. 2.0105 3.4 5.936638 10.2 25. 5.2<br />
4. 2.3683 3.3 5.632203 10.2 25. 5.2<br />
5. 2.8491 4.8 5.978024 10.2 25. 5.2<br />
6. 2.2280 3.5 5.546851 10.2 25. 5.2<br />
Se menŃionează că în paranteza care de<strong>fi</strong>neşte formatarea se pot include şi caractere<br />
alfanumerice între apostroafe simple. De exemplu pentru matricea<br />
⎡10 50⎤<br />
DATA1 =<br />
⎢<br />
20 70<br />
⎥<br />
⎢ ⎥<br />
⎢⎣<br />
30 80⎥⎦<br />
secvenŃa de comenzi:<br />
*CFOPEN,VECTOR1,TXT<br />
*VWRITE,SEQU,DATA1(1,1),DATA1(1,2),(DATA1(1,1)+DATA1(1,2))<br />
(' ROW',F3.0,' CONTAINS ',2F7.3,'. IS THEIR SUM ',F7.3,' ?')<br />
*CFCLOSE<br />
are drept rezultat <strong>fi</strong>şierul vector1.txt care arată astfel:<br />
ROW 1. CONTAINS 10.000 50.000. IS THEIR SUM 60.000 ?<br />
ROW 2. CONTAINS 20.000 70.000. IS THEIR SUM 60.000 ?<br />
ROW 3. CONTAINS 30.000 80.000. IS THEIR SUM 60.000 ?
1.1.7. OperaŃii <strong>cu</strong> vectori şi matrice<br />
O modalitate mai rapidă de a efectua operaŃii vectoriale decât utilizarea operaŃiilor în<br />
cadrul <strong>unui</strong> ciclu, <strong>cu</strong>m ar <strong>fi</strong> adunări/scăderi, sin, cos, produs vectorial sau produs scalar, etc<br />
pot <strong>fi</strong> efectuate <strong>cu</strong> o serie de comenzi prede<strong><strong>fi</strong>nite</strong> <strong>cu</strong>m ar <strong>fi</strong>: *VOPER, *VFUNC, *VSCFUN,<br />
*VITRP. Vectorii care se folosesc în cadrul acestor comenzi trebuie declaraŃi anterior <strong>cu</strong><br />
funcŃia *DIM ca variabile de tip vector sau tabel. Structura comenzii *VOPER este:<br />
*VOPER, ParR, Par1, Oper, Par2, CON1, CON2<br />
în care argumentele funcŃiei sunt:<br />
ParR –numele parametrului rezultant care trebuie declarat anterior;<br />
Par1 –primul parametru utilizat în operaŃie, poate <strong>fi</strong> şi un scalar, sau un parametru scalar;<br />
Oper - operaŃia care se efectuează, poate <strong>fi</strong> una dintre:<br />
ADD pentru adunare Par1+Par2;<br />
SUB pentru scădere Par1-Par2;<br />
MULT pentru înmulŃire Par1*Par2;<br />
DIV pentru împărŃire Par1/Par2 (o împărŃire <strong>cu</strong> zero dă zero!);<br />
MIN sau MAX pentru minimum şi maximum;<br />
LT, LE, EQ, NE, GE şi GT pentru mai mic, mai mic sau egal, egal, not egal, mai<br />
mare sau egal şi strict mai mare. Rezultatul este 1 pentru adevărat şi 0 pentru fals;<br />
DER1 prima derivată d(Par1)/d(Par2). Par2 trebuie să <strong>fi</strong>e în ordine crescătoare;<br />
DER2 derivata a doua d 2 (Par1)/d(Par2) 2 ;<br />
INT1 integrala simplă ∫ Par1 d(Par2), unde CON1 este constanta de interare;<br />
Par1 d(Par2), unde CON1 este constanta de<br />
INT2 este integrala conse<strong>cu</strong>tivă ∫ ∫<br />
integrare a primei integrale iar CON2 este constanta de integrare a celei de-a doua integrări.<br />
Dacă Par1 conŃine date legate de distribuŃia de acceleraŃie, atunci CON1 este viteza iniŃială iar<br />
CON2 este deplasarea iniŃială;<br />
DOT produs scalar;<br />
CROSS produs vectorial.<br />
Par2 – al doilea parametru în operaŃie.<br />
CON1 – prima constantă de integrare pentru operaŃiile INT1 şi INT2.<br />
CON2 - a doua constantă de integrare pentru operaŃia INT2.<br />
O comandă similară este *MOPER.<br />
Comanda *VFUNC efectuează o funcŃie asupra <strong>unui</strong> singur vector Par1 şi are sintaxa:<br />
*VFUN, ParR, Func, Par1, CON1, CON2, CON3<br />
în care argumentul<br />
Func este funcŃia apelată şi poate <strong>fi</strong> una dintre funcŃiile uzuale:<br />
ACOS,<br />
ASIN,<br />
ASORT (parametrul Par1 este sortat în ordine crescătoare),<br />
ATAN,<br />
COMP (compres),<br />
COPY,<br />
COS,<br />
COSH,<br />
DIRCOS (cosinusurile directoare ale tensiunilor principale),<br />
DSORT (parametrul Par1 este sortat în ordine descrescătoare),<br />
EULER (unghiurile Euler pentru tensiunile principale),
EXP,<br />
EXPA (expandare-reversul COMP),<br />
LOG,<br />
LOG10,<br />
NINT (cel mai apropiat întreg),<br />
NOT,<br />
PRIN (tensiunile principale din componente),<br />
PWR (funcŃia putere),<br />
SIN,<br />
SINH,<br />
SQRT,<br />
TAN,<br />
TANH,<br />
TANG (tangenta la o <strong>cu</strong>rbă),<br />
NORM (normala la o <strong>cu</strong>rbă),<br />
LOCAL (transformă coordonatele globale într-un sistem de coordonate local),<br />
GLOBAL (transformă coordonatele dintr-un sistem de coordonate local în sistemul de<br />
coordonate global).<br />
Par1 – parametrul implicat în operaŃie.<br />
CON1, CON2, CON3 - constante (utilizate doar pentru funcŃiile PWR, NORM, LOCAL şi<br />
GLOBAL).<br />
Deci operaŃiile efectuate pot <strong>fi</strong> rezumate în<br />
ParR = f(Par1)<br />
unde funcŃia (f) a fost descrisă mai sus. Dacă rezultatul depăşeşte domeniul de reprezentare al<br />
numerelor, adică partea exponenŃială este mai mică decât -32 ori mai mare decât 32 atunci<br />
funcŃia atribuie valoarea zero. OperaŃiile continuă să „umple” vectorul ParR complet dacă nu<br />
există alte speci<strong>fi</strong>caŃii suplimentare date prin comenzile *VLEN sau *VMASK.<br />
Comanda *VLEN speci<strong>fi</strong>că numărul de operaŃii efectuate pre<strong>cu</strong>m şi incrementul.<br />
Comanda *VMASK permite efectuarea parŃială numai a unor rânduri funcŃie de un alt vector<br />
care conŃine <strong>elemente</strong> 0 şi 1 în poziŃiile care trebuie „par<strong>cu</strong>rse”.<br />
Uneori este util ca parametri care intră în operaŃie (sau chiar rezultatul) să <strong>fi</strong>e folosiŃi<br />
<strong>cu</strong> valoarea lor absolută, pentru aceasta se activează funcŃia *VABS. Dacă parametri trebuie<br />
să <strong>fi</strong>e multiplicaŃi <strong>cu</strong> un factor atunci se poate folosi funcŃia *VFACT. Dacă trebuie exe<strong>cu</strong>tată<br />
o comandă de genul<br />
ParR = ParR + ParR(Precedent),<br />
atunci se poate folosi opŃiunea funcŃiei *VCUM.<br />
Pentru a obŃine anumite proprietăŃi ale <strong>unui</strong> vector Par1 se poate utiliza funcŃia <strong>cu</strong><br />
sintaxa:<br />
*VSCFUN, ParR, Func, Par1<br />
în care<br />
ParR este un parametru scalar, iar<br />
Func poate să <strong>fi</strong>e<br />
MAX,<br />
MIN,<br />
LMAX, LMIN (indexul de localizare),<br />
FIRST, LAST (indexul primei/ultimei valori nenule din vector),<br />
SUM (suma <strong>elemente</strong>lor vectorului),<br />
MEDI (valoarea de mijloc),<br />
MEAN ( adică (σ Par1)/NUM, unde NUM este numărul valorilor însumate),<br />
VARI (σ ((Par1-MEAN)**2))/NUM,
STDV (deviaŃia standard: radical din VARI),<br />
RMS (Root-mean-square: radical din (σ (Par1**2))/NUM),<br />
NUM (Numărul valorilor adunate –valorile mascate nu sunt numărate).<br />
Cu comanda *VITRP se poate extrage o matrice de tip vector dintr-o matrice de tip<br />
tabel prin interpolare liniară.<br />
Exemplele următoare prezintă modul de lucru ale funcŃiilor enumerate mai sus. Se<br />
consideră că parametrii următori sunt deja de<strong>fi</strong>niŃi (X şi Y ar pute <strong>fi</strong> de<strong>fi</strong>niŃi <strong>cu</strong> comenzile de<br />
mai jos)<br />
*DIM,X,ARRAY,4,4<br />
*VFILL,X(1,1),DATA,-2,1,4,-8<br />
*VFILL,X(1,2),DATA,6,0,-3,1<br />
*VFILL,X(1,3),DATA,8,2,-1,10<br />
*VFILL,X(1,4),DATA,0,12,7,-5<br />
*DIM,Y,ARRAY,4,4<br />
*VFILL,Y(1,1),DATA,3,-5,8,1<br />
*VFILL,Y(1,2),DATA,2,-7,0,4<br />
*VFILL,Y(1,3),DATA,5,1,0,9<br />
*VFILL,Y(1,4),DATA,-6,0,11,16<br />
⎡ 0 ⎤<br />
⎢ ⎥<br />
⎡−<br />
2 6 8 0 ⎤ ⎡ 3 2 5 − 6⎤<br />
⎢<br />
15<br />
⎥<br />
⎢<br />
⎥<br />
= ⎢<br />
1 0 2 12<br />
⎢<br />
⎥<br />
⎢30⎥<br />
X<br />
⎥ ⎢<br />
− 5 − 7 1 0<br />
⎥<br />
⎢ ⎥<br />
Y =<br />
THETA =<br />
⎢ 4 − 3 −1<br />
7 ⎥ ⎢ 8 0 0 11 ⎥<br />
⎢45⎥<br />
⎢<br />
⎥ ⎢<br />
⎥<br />
⎢60⎥<br />
⎣−<br />
8 1 10 − 5⎦<br />
⎣ 1 4 9 16 ⎦<br />
⎢ ⎥<br />
⎢75⎥<br />
⎢ ⎥<br />
⎣90⎦<br />
Pentru început se de<strong>fi</strong>neşte un vector Z1 care este rezultatul adunării coloanei 2 din X<br />
<strong>cu</strong> coloana 1 din Y. Pentru acesta se exe<strong>cu</strong>tă comenzile<br />
*DIM,Z1,ARRAY,4<br />
*VOPER,Z1(1),X(1,2),ADD,Y(1,1)<br />
care conduc la rezultatul:<br />
⎡ 9 ⎤<br />
⎢ ⎥<br />
⎢<br />
− 5<br />
Z 1 = ⎥ .<br />
⎢ 5 ⎥<br />
⎢ ⎥<br />
⎣ 2 ⎦<br />
În exemplul următor se înmulŃeşte prima coloană din X (începând <strong>cu</strong> rândul 2) <strong>cu</strong> a<br />
patra coloană din Y (începând <strong>cu</strong> rândul 1) şi se salvează rezultatele în vectorul Z2 începând<br />
<strong>cu</strong> rândul 1:<br />
*DIM,Z2,ARRAY,3<br />
*VOPER,Z2(1),X(2,1),MULT,Y(1,4)<br />
Rezultatul este:<br />
⎡ − 6 ⎤<br />
Z 2 =<br />
⎢ ⎥<br />
⎢<br />
0<br />
⎥<br />
⎢⎣<br />
− 88⎥⎦<br />
Pentru comenzile în care se implică operaŃii matriceale:
*DIM,Z3,ARRAY,4,4,1, , ,<br />
*MOPER,Z3(1,1),X(1,1),MULT,Y(1,1)<br />
se obŃine<br />
⎡28<br />
− 46 − 4 100⎤<br />
⎢<br />
⎥<br />
⎢<br />
31 50 113 208<br />
Z 3 =<br />
⎥ .<br />
⎢26<br />
57 80 77 ⎥<br />
⎢<br />
⎥<br />
⎣46<br />
− 43 − 84 78 ⎦<br />
În următorul exemplu se dimensionează mai întâi matricea Z4 şi apoi se exe<strong>cu</strong>tă<br />
produsul vectorial pentru patru perechi de vectori. Componentele i, j şi k a acestor vectori sunt<br />
coloanele 1, 2 şi 3 din X şi coloanele 2, 3 şi 4 din Y. Aceste rezultate sunt scrise în matricea<br />
Z4, pentru care componentele i, j şi k sunt vectorii din coloanele 1, 2 şi 3.<br />
*DIM,Z4,ARRAY,4,3<br />
*VOPER,Z4(1,1),X(1,1),CROSS,Y(1,2)<br />
⎡−<br />
76 4 − 22⎤<br />
⎢<br />
⎥<br />
⎢<br />
− 2 −14<br />
1<br />
Z 4 =<br />
⎥<br />
⎢−<br />
33 − 44 0 ⎥<br />
⎢<br />
⎥<br />
⎣−<br />
74 168 − 76⎦<br />
Pentru prima pereche de vectori: -2i+6j+8k şi 2i+5j-6k, rezultă prima linie, adică<br />
i j k<br />
− 2 6 8 = −76i<br />
+ 4j − 22k .<br />
2<br />
5 − 6<br />
Comenzile de mai jos exe<strong>cu</strong>tă: se dimensionează matricea A4; se setează interpretarea<br />
unghiurilor în grade; se cal<strong>cu</strong>lează în prima coloană cosinus de theta, apoi în coloana<br />
următoare sinus de theta, iar în ultima coloană se atribuie valori constante egale <strong>cu</strong> 2. În<br />
această situaŃie variabila A4 reprezintă un arc de cerc de rază 1 reprezentat prin 7 puncte<br />
echidistante care se află în planul z=2.<br />
*DIM,A4,ARRAY,7,3<br />
*AFUN,DEG<br />
*VFUN,A4(1,1),COS,THETA(1)<br />
*VFUN,A4(1,2),SIN,THETA(1)<br />
A4(1,3)=2,2,2,2,2,2,2<br />
OperaŃiile matriceale se efectuează <strong>cu</strong> comanda *MOPER care are sintaxa:<br />
*MOPER, ParR, Par1, Oper, Par2, Par3, kDim, --, kOut<br />
în care argumentele au semni<strong>fi</strong>caŃia:<br />
ParR – numele parametrului în care se stochează rezultatele;<br />
Par1 – primul parametru de intrare implicat în operaŃie. Pentru unele operaŃii <strong>cu</strong>m ar <strong>fi</strong> MAP,<br />
acesta trebuie să să aibă dimensiunea N x 3 , adică coordonatele pentru care se doreşte a <strong>fi</strong><br />
efectuată interpolarea, iar ParR rezultă de dimensiune N(out) x M şi conŃine valorile<br />
interpolate;<br />
Oper - operaŃia matriceală, care poate <strong>fi</strong>:<br />
INVERT (inversarea unei matrice pătratice);<br />
MULT (înmulŃire de matrice);<br />
COVAR (covarianŃa);<br />
CORR (coe<strong>fi</strong>cienŃii de corelaŃie);
SOLV (rezolvarea <strong>unui</strong> sistem de e<strong>cu</strong>aŃii liniar, se rezolvă unsistem de n e<strong>cu</strong>aŃii <strong>cu</strong> n<br />
ne<strong>cu</strong>nos<strong>cu</strong>te de forma a n1 x 1 + a n2 x 2 + ... + a nn x n = b n unde Par1 conŃine matricea coe<strong>fi</strong>cienŃilor<br />
a, Par2 vectorul sau vectorii valorilor b, şi ParR este vectorul sau vectorii ne<strong>cu</strong>nos<strong>cu</strong>telor x;<br />
SORT,<br />
NNEAR (determinarea rapidă a celor mai apropiate noduri faŃă de vectorul Par1 a<br />
coordonatelor n x 3;<br />
ENEAR (cel mai apropiat element faŃă de un vector de coordonate);<br />
MAP (proiectarea unor rezultate dintr-un <strong>program</strong> în altul, un fel de interpolare)<br />
Par2 – al doilea parametru implicat în operaŃii<br />
Par3 - al treilea parametru implicat în operaŃii<br />
kDim - criteriul de interpolare utilizat în MAP (pe o suprafaŃă sau pe un volum)<br />
kOut – criteriul de interpolare în afara regiunii declarate<br />
Toate operaŃiile <strong>cu</strong> vectori şi matrice sunt afectaŃi de speci<strong>fi</strong>caŃiile din anumite<br />
comenzi <strong>cu</strong>m ar <strong>fi</strong>: *VCUM (soluŃie <strong>cu</strong>mulativă), *VABS (se lucrează <strong>cu</strong> valori absolute),<br />
*VFACT (se scalează <strong>cu</strong> un factor), *VLEN (numărul de rânduri implicate în operaŃie),<br />
*VCOL (numărul de coloane implicat în operaŃie), and*VMASK (selectarea parŃială) şi care<br />
sunt resetate la implicit după <strong>fi</strong>ecare operaŃie <strong>cu</strong> vectori şi matrice. Starea <strong>cu</strong>rentă a<br />
speci<strong>fi</strong>caŃiilor se poate afla <strong>cu</strong> *VSTAT. Se precizează că funcŃiile de speci<strong>fi</strong>caŃie devin<br />
active doar atunci când operaŃiile implicate permit acest lucru.<br />
Vectorii se pot reprezenta gra<strong>fi</strong>c utilizând comanda *VPLOT. Eticheta axei<br />
ordonatelor se poate modi<strong>fi</strong>ca <strong>cu</strong> comanda /GCOLUMN.<br />
1.1.8. Limbajul APDL utilizat în macrouri<br />
O serie de comenzi frecvente se pot salva într-un <strong>fi</strong>şier şi apoi se pot apela ori de câte<br />
ori este nevoie printr-o comandă similară celor din ANSYS. Această listă de comenzi poartă<br />
numele de “macrou”. Macrourile pot să conŃină (includă) alte macrouri, adică un macou<br />
poate să apeleze alt macrou şi aşa mai departe. Se pot utiliza până la 20 de nivele de<br />
includere.<br />
Fig. 1.2: Geometria parametrică <strong>unui</strong> nit, în macroul nit_1.mac
Un exemplu de macrou care de<strong>fi</strong>neşte un nit (în /prep7) în planul de lucru <strong>cu</strong>rent, <strong>cu</strong><br />
axa nitului pe direcŃia Z şi centul nitului chiar in originea planului de lucru (vezi Fig. 1.2)<br />
este:<br />
!* VERSIUNEA 1.0 STEFAN SOROHAN 01/06/2007<br />
!* MACROUL DEFINESTE UN NIT PLIN CU CAP TRONCONIC DE GEOMETRIE:<br />
!* DIAMETRU D = ARG1<br />
!* LUNGIME PARTE CILINDRICA L = ARG2<br />
!* DIAMETRU MAX A CAPULUI DE NIT DC = ARG3<br />
!* INALTIMEA CAPULUI DE NIT H = ARG4<br />
/NOPR ! SE SUPRIMA PRINTAREA COMENZILOR DIN MACROU<br />
!* VERIFICAREA SI CORECTIA DATELOR DE INTRARE<br />
*IF,ARG1,LE,0,THEN<br />
ARG1=1 ! implicit diametrul nitului este 1<br />
*MSG, NOTE, 'NIT',1,1,2,0.75<br />
DIAMETRU ( %C) = %I, LUNGIME = %G, DIAM CAP NIT = %G, INALTIME CAP<br />
NIT = %G<br />
*ENDIF<br />
*IF,ARG2,LE,0,THEN<br />
ARG2=ARG1<br />
*ENDIF<br />
*IF,ARG3,LE,0,THEN<br />
ARG3=2*ARG1<br />
*ENDIF<br />
*IF,ARG4,LE,0,THEN<br />
ARG4=0.75*ARG1<br />
*ENDIF<br />
*IF,DC,LE,D,THEN<br />
ARG3=2*ARG1<br />
*ENDIF<br />
VSEL,U,,,ALL ! DESELECTAREA TUTUROR VOLUMELOR<br />
!* CREAREA NITULUI<br />
CYLIND,ARG1/2, ,-ARG2/2,ARG2/2,0,360,<br />
CONE,ARG3/2,ARG1/2,ARG2/2,ARG2/2+ARG4,0,360,<br />
CONE,ARG1/2,ARG3/2,-ARG2/2-ARG4,-ARG2/2,0,360,<br />
VADD,ALL ! ADUNAREA CELOR TREI VOLUME DEFINITE<br />
VSEL,S,,,ALL ! SELECTAREA TUTUROR VOLUMELOR<br />
/GO<br />
! IN CONTINUARE SE SCRIU (AFISEAZA) COMENZILE<br />
Dacă acest macrou este salvat în <strong>fi</strong>şierul nit_1.mac atunci el se poate apela <strong>cu</strong><br />
comanda:<br />
*USE,NIT_1<br />
sau, deoarece extensia este mac, prin simpla apelare<br />
NIT_1<br />
în acesta variantă de apelare se obŃine un nit <strong>cu</strong> dimensiunile prede<strong><strong>fi</strong>nite</strong> în macrou, adică<br />
D = 1; L = 1, D c = 2; H = 0,75,<br />
dacă spre exemplu se doreşte obŃinerea <strong>unui</strong> nit <strong>cu</strong> dimensiunile
D = 2; L = 3, D c = 4; H = 1<br />
atunci se foloseşte comanda:<br />
NIT_1,2,3,4,1<br />
Macrourile se pot crea în ANSYS sau se pot utiliza o serie de editoare text (wordpad<br />
de exemplu) în care se “scriu” comenzi.<br />
Macrourile trebuie să nu <strong>fi</strong>e denumite identic <strong>cu</strong> numele comenzilor ANSYS, sau să<br />
înceapă <strong>cu</strong> primele 4 caractere ale unei comenzi ANSYS deoarece atunci <strong>program</strong>ul exe<strong>cu</strong>tă o<br />
comandă internă şi nu macroul. Numele <strong>fi</strong>şierului macrou nu trebuie să depăşească 32 de<br />
caractere, nu poate să înceapă <strong>cu</strong> un număr, extensia nu poate să <strong>fi</strong>e mai lungă decât 8<br />
caractere (dacă se doreşte apelarea prin numele <strong>fi</strong>şierului această extensie trebuie să <strong>fi</strong>e<br />
.MAC). Se recomandă totuşi evitarea utilizării de extensii .mac deoarece acestea sunt <strong>folosit</strong>e<br />
de regulă pentru macrourile prede<strong><strong>fi</strong>nite</strong> ale <strong>program</strong>ului ANSYS.<br />
Atunci când se exe<strong>cu</strong>tă un macrou <strong>cu</strong> extensia mac, ordinea de căutare a numelui<br />
<strong>fi</strong>şierului este: 1. directorul /ansys_inc/v100/ansys/apdl; 2. directoarele speci<strong>fi</strong>cate în<br />
ANSYS_MACROLIB; 3. directorul speci<strong>fi</strong>cat prin $HOME; 4. directorul de lucru.<br />
În interiorul <strong>program</strong>ului ANSYS un macrou se poate crea prin patru metode:<br />
-1. folosind comanda *CREATE, dar astfel valorile unor parametri trebuie declarate în<br />
<strong>fi</strong>şierul macro şi se pot schimba la apelare;<br />
-2. folosind comenzile *CFOPEN, *CFWRITE şi *CFCLOS, în acest fel se rezolvă<br />
problema parametrilor;<br />
-3. folosind comanda /TEE în linia de comandă care scrie o listă de comenzi într-un<br />
<strong>fi</strong>şier odată <strong>cu</strong> exe<strong>cu</strong>tarea unor comenzi, astfel parametrii se utilizează <strong>cu</strong> valoarea lor <strong>cu</strong>rentă,<br />
dar în <strong>fi</strong>şierul creat nu se rezolvă problema parametrilor, care se înregistrează <strong>cu</strong> numele lor;<br />
-4. folosind Utility Menu> Macro> Create Macro. Această metodă deschide o<br />
fereastră dialog în care se crează un macro, dar nici astfel nu se rezolvă complet problema<br />
parametrilor.<br />
Este posibil a introduce mai multe macrouri într-un singur <strong>fi</strong>şier. În acest fel pot <strong>fi</strong><br />
create biblioteci de macrouri. Fişierul nu trebuie să aibă o extensie explicită şi are structura de<br />
forma:<br />
MACRONAME1<br />
.<br />
.<br />
/EOF<br />
MACRONAME2<br />
.<br />
.<br />
/EOF<br />
MACRONAME3<br />
.<br />
.<br />
./EOF<br />
Orice macrou se poate exe<strong>cu</strong>ta prin apelare <strong>cu</strong> comanda *USE. De exemplu apelarea<br />
macroului MYMACRO (fără extensie) care este salvat undeva în zona de căutare a<br />
<strong>program</strong>ului ANSYS se dă comanda:<br />
*USE,MYMACRO<br />
în acest fel, macroul nu are argumente. Dacă acest macrou este salvat în alt director:<br />
/myaccount/macros şi are numele MYMACRO.MACRO se apelează <strong>cu</strong>:<br />
*USE,/MYACCOUNT/MACROS/MYMACRO.MACRO
Dacă macroul are extensia .mac şi se află salvat în zona de căutare a <strong>program</strong>ului,<br />
atunci exe<strong>cu</strong>Ńia lui constă în simpla apelare din linia de comandă<br />
MYMACRO<br />
Dacă macroul are argumente, acestea urmează imediat după numele de apelare, şi sunt<br />
încadrate de virgule, adică<br />
MYMACRO,4,3,2,1.5<br />
sau<br />
*USE,MYMACRO.MAC,4,3,2,1.5<br />
Utilizarea macrourilor salvate într-o bibliotecă de macrouri, se face similar <strong>cu</strong><br />
deosebirea că înainte de apelare se speci<strong>fi</strong>că (selectează) <strong>fi</strong>şierul în care este salvat macroul<br />
respectiv folosind comanda *ULIB. De exemplu dacă macroul se află în <strong>fi</strong>şierul<br />
mymacros.mlib din directorul the /myaccount/macros, atunci comanda este:<br />
*ULIB,MYMACROS,MLIB,/MYACCOUNT/MACROS/<br />
Limbajul APDL permite două seturi de parametri scalari care pot <strong>fi</strong> <strong>folosit</strong>i ca<br />
variabile locale. Acestea sunt:<br />
• Un set de parametri de atribuire care se apelează odată <strong>cu</strong> macroul;<br />
• O serie de parametri care sunt folosiŃi şi sunt vizibili numai în interiorul macroului.<br />
Parametri de atribuire sunt prede<strong>fi</strong>niŃi şi sunt în număr de maxim 19. Aceşti parametri<br />
pot <strong>fi</strong> refolosiŃi în macrouri care apelează alte macrouri, deoarece de <strong>fi</strong>ecare dată aceşti<br />
parametri sunt locali. Parametrii au nume prede<strong><strong>fi</strong>nite</strong>, de la ARG1 până la AR19 şi pot <strong>fi</strong><br />
utilizaŃi ca numere, caractere alfanumerice (de lungime maximă 8 caractere şi încadrate între<br />
apostroafe), parametri numerici sau tip CHAR şi expresii parametrice.<br />
De exemplu, următorul macrou (mymacro.mac) necesită introducerea a patru<br />
argumente: ARG1, ARG2, ARG3 şi ARG4:<br />
/PREP7<br />
/VIEW,,-1,-2,-3<br />
BLOCK,,ARG1,,ARG2,,ARG3<br />
SPHERE,ARG4<br />
VSBV,1,2<br />
FINISH<br />
Pentru a exe<strong>cu</strong>ta acest macrou, un utilizator trebuie să-l apeleze <strong>cu</strong> comanda:<br />
MYMACRO,4,3,2.2,1<br />
Fiecare macrou poate avea până la 79 de parametrii scalari utilizaŃi ca variabile locale<br />
(AR20 până la AR99). Aceşti parametrii sunt complet locali şi nu pot <strong>fi</strong> transmişi dintr-un<br />
macrou în altul decât prin folosirea comenzii /INPUT sau a <strong>unui</strong> ciclu "do loop" în interiorul<br />
<strong>unui</strong> macrou.<br />
Pe lângă parametri locali din <strong>fi</strong>ecare macrou, <strong>program</strong>ul ANSYS are un set de<br />
parametrii scalari prede<strong>fi</strong>niŃi ARG1 până la AR99 care sunt locali într-un <strong>fi</strong>şier de intrare şi<br />
nu se suprapun <strong>cu</strong> cei din interiorul <strong>fi</strong>ecărui macrou.<br />
1.1.9. SecvenŃa de exe<strong>cu</strong>Ńie a <strong>unui</strong> <strong>program</strong> în APDL<br />
Atunci când <strong>program</strong>ul exe<strong>cu</strong>tă comenzile dintr-un <strong>fi</strong>şier, acestea sunt exe<strong>cu</strong>tate în<br />
ordinea în care apar, totuşi sunt o serie de comenzi care permit dirijarea exe<strong>cu</strong>Ńiei unor<br />
comenzi. Aceste comenzi sunt: apelarea subrutinelor (macrourilor); exe<strong>cu</strong>Ńia unei comenzi de<br />
salt condiŃionat (*IF) sau chiar necondiŃionat (GOTO) şi exe<strong>cu</strong>Ńia repetată a unei comenzi <strong>cu</strong><br />
incrementare.
Limbajul APDL permite până la 20 de nivele de apelare în “adâncime”, adică un<br />
macrou lansat apelează alt macrou şi aşa mai departe. D exemplu într-o bibliotecă de macrouri<br />
macroul MYSTART apelează macroul MYSPHERE pentru a crea o sferă:<br />
MYSTART<br />
/PREP7<br />
/VIEW,,-1,-2,-3<br />
MYSPHERE,1.2<br />
FINISH<br />
/EOF<br />
MYSPHERE<br />
SPHERE,ARG1<br />
/EOF<br />
Cea mai simplă comandă de salt necondiŃionat este *GO, de exemplu secvenŃa de<br />
instrucŃiuni de mai jos arată utilizarea comenzii.<br />
*GO,:BRANCH1<br />
--- ! Acest bloc de comenzi nu se exe<strong>cu</strong>tă<br />
---<br />
:BRANCH1<br />
---<br />
---<br />
Eticheta speci<strong>fi</strong>cată prin comanda *GO trebuie să înceapă <strong>cu</strong> (:) şi să nu conŃină mai<br />
mult de 8 caractere inclusiv cele două puncte.<br />
Limbajul APDL permite exe<strong>cu</strong>tarea <strong>unui</strong> set alternativ de blo<strong>cu</strong>ri pe baza evaluării<br />
unei condiŃii prin comanda *IF.<br />
Comanda *IF are următoarea sintaxă:<br />
*IF, VAL1, Oper, VAL2, Base<br />
în care<br />
VAL1 este primul parametru în comparaŃie;<br />
Oper este operatorul de comparaŃie; Operatorii de comparaŃie sunt:<br />
EQ (egal);<br />
NE (diferit);<br />
LT (mai mic decât);<br />
GT (mai mare decât);<br />
LE (mai mic sau egal);<br />
GE (mai mare sau egal);<br />
ABLT (mai mic în valori absolute);<br />
ABGT (mai mare în valori absolute).<br />
VAL2 este al doilea parametru în operaŃie;<br />
Base este acŃiunea care urmează a <strong>fi</strong> exe<strong>cu</strong>tată dacă evaluarea este adevărată. Dacă<br />
argumentul Base ia valoarea THEN atunci comanda *IF se transformă într-o comandă if-thenelse<br />
(similară <strong>program</strong>ului FORTRAN). ConstrucŃia completă este<br />
• O comandă *IF urmată de<br />
• Una sau mai multe comenzi *ELSEIF<br />
• O comandă opŃională *ELSE<br />
• O comandă obligatorie *ENDIF care marchează sfârşitul construcŃiei.<br />
În combinaŃie comanda *IF poate lucra ca o funcŃie CASE în alte limbaje.<br />
Dacă argumentul Base ia valoarea STOP, se iese din <strong>program</strong>. Uneori pentru ştergerea<br />
parametrilor se foloseşte comanda /CLEAR, care poate şterge şi parametrii de control a<br />
instrucŃiunii de decizie, deci se impune mare atenŃie în manipularea parametrilor.
1.1.10. Repetarea comenzilor, cicluri<br />
Cea mai simplă comandă de repetare este comanda *REPEAT. Aceasta permite<br />
exe<strong>cu</strong>tarea comenzii precedente de un număr de ori, prin simpla incrementare <strong>cu</strong> o constantă a<br />
unor câmpuri Exemplul de mai jos de creare a unor <strong>elemente</strong> de tip linie, este foarte sugestiv<br />
E,1,2<br />
*REPEAT,5,0,1<br />
acest şir de comenzi exe<strong>cu</strong>tă prin comanda E,1,2 un element între nodurile 1 şi 2, apoi<br />
comanda *REPEAT mai generează 4 <strong>elemente</strong> (numărul 5 include şi comanda iniŃială)<br />
rezultând în <strong>fi</strong>nal <strong>elemente</strong>le de<strong><strong>fi</strong>nite</strong> de nodurile: 1-2, 1-3, 1-4, 1-5 şi 1-6. Se menŃionează că<br />
majoritatea comenzilor care încep <strong>cu</strong> / sau * (<strong>cu</strong> excepŃia celor de gra<strong>fi</strong>că) nu pot <strong>fi</strong> repetate <strong>cu</strong><br />
comanda *REPEAT.<br />
Comenzile *DO pot exe<strong>cu</strong>ta o serie de comenzi de un număr speci<strong>fi</strong>cat de ori.<br />
Comenzile *DO şi *ENDDO încadrează începutul şi sfârşitul <strong>unui</strong> ciclu. Sintaxa comenzii<br />
este:<br />
*DO, Par, IVAL, FVAL, INC<br />
în care<br />
Par este parametrul utilizat în indexarea ciclului;<br />
IVAL, FVAL, INC reprezintă valoarea iniŃială, <strong>fi</strong>nală şi pasul a parametrului. Pasul nu poate<br />
<strong>fi</strong> negativ şi trebuie să <strong>fi</strong>e număr întreg.<br />
Următorul exemplu, editează cinci cazuri de încărcare şi face unele schimbări în<br />
<strong>fi</strong>ecare dintre ele:<br />
*DO,I,1,5 ! For I = 1 to 5:<br />
LSREAD,I ! Citeşte cazul de încărcare I<br />
OUTPR,ALL,NONE ! Schimbă parametrii de control pentru OUTPUT<br />
ERESX,NO ! Nu se extrapoleaza tensiunile la noduri<br />
LSWRITE,I ! Rescrie cazul de încărcare I<br />
*ENDDO<br />
În interiorul ciclurilor pot <strong>fi</strong> utilizate comenzile *IF, *EXIT sau *CYCLE. Regulile de<br />
bază ale <strong>program</strong>ării structurate este bine a <strong>fi</strong> <strong>folosit</strong>e şi în cadrul <strong>program</strong>ului ANSYS.<br />
Există şi o formă indirectă de a exe<strong>cu</strong>ta comenzi tip ciclu prin utilizarea a două puncte<br />
ca în Matlab. Această convenŃie exe<strong>cu</strong>tă mai rapid comenzile deoarece se face direct în<br />
memorie. Sintaxa directă este:<br />
(x:y:z)<br />
în care z implicit este 1 dacă nu este speci<strong>fi</strong>cat. De exemplu comanda<br />
N,(1:6),(2:12:2)<br />
exe<strong>cu</strong>tă acelaşi lucru <strong>cu</strong> seria de comenzi:<br />
N,1,2<br />
N,2,4<br />
N,3,6<br />
.<br />
.<br />
.<br />
N,6,12<br />
Se menŃionează că cea mai s<strong>cu</strong>rtă expresie controlează exe<strong>cu</strong>Ńia ciclului. De exemplu<br />
comanda N,(1:7),(2:12:2) are acelaşi efect ca precedenta.<br />
Alte comenzi care se pot folosi sunt *DOWHILE (repetă până când un parametru<br />
extern se modi<strong>fi</strong>că).<br />
1.1.11. Parametri _STATUS şi _RETURN în Macrouri
Programul ANSYS generează doi parametri interni _STATUS şi _RETURN care pot<br />
<strong>fi</strong> folosiŃi în macrouri. De exemplu funcŃiile de modelare solidă generează parametrul<br />
_RETURN care conŃine rezultatul exe<strong>cu</strong>tării funcŃiei. De exemplu exe<strong>cu</strong>tarea unei comenzi<br />
de generare a <strong>unui</strong> Keypoint <strong>cu</strong> comanda K atribuie parametrului _RETURN numărul acelui<br />
Keypoint. Exe<strong>cu</strong>Ńia unei comenzi oarecare (inclusiv un macro) generează parametrul<br />
_STATUS. Acest parametru prin valoarea lui reflectă starea exe<strong>cu</strong>tării, adică:<br />
0 (fără eroare);<br />
1 (o notă explicativă);<br />
2 (un warning);<br />
3 (<strong>cu</strong> eroare).<br />
1.1.12. Exemple simple de macrouri<br />
Primul exemplu de macrou numit offset.mac, deplasează setul nodurilor selectate în<br />
cadrul preprocesorului PREP7. Acest macrou este prezentat numai din considerente<br />
demonstrative deoarece comanda NGEN este mai e<strong>fi</strong>cientă. Deoarece toate comenzile<br />
inclusiv comentariile unor macrouri prede<strong><strong>fi</strong>nite</strong> sunt în limba engleză, următorul exemplu se<br />
prezintă aşa <strong>cu</strong>m este descris în manualul APDL din ANSYS:<br />
! Macro to offset selected nodes in PREP7<br />
! The below <strong>fi</strong>le is saved as: offset.mac<br />
! Usage: OFFSET,DX,DY,DZ<br />
/NOP<br />
! suppress printout for this macro<br />
*GET,NNODE,NODE,,NUM,MAX ! get number of nodes<br />
*DIM,X,,NNODE<br />
*DIM,Y,,NNODE<br />
*DIM,Z,,NNODE<br />
*DIM,SEL,,NNODE<br />
! set up arrays for node locations<br />
! set up array for select vector<br />
*VGET,X(1),NODE,1,LOC,X ! get coordinates<br />
*VGET,Y(1),NODE,1,LOC,Y<br />
*VGET,Z(1),NODE,1,LOC,Z<br />
*VGET,SEL(1),NODE,1,NSEL ! get selected set<br />
*VOPER,X(1),X(1),ADD,ARG1 ! offset locations<br />
*VOPER,Y(1),Y(1),ADD,ARG2<br />
*VOPER,Z(1),Z(1),ADD,ARG3<br />
! *DO,I,1,NNODE ! store new positions<br />
! *IF,SEL(I),GT,0,THEN ! this form takes 98 sec for 100,000 nodes<br />
! N,I,X(I),Y(I),Z(I)<br />
! *ENDIF<br />
! *ENDDO<br />
*VMASK,SEL(1) ! takes 3 seconds for 100,000 nodes<br />
N,(1:NNODE),X(1:NNODE),Y(1:NNODE),Z(1:NNODE)<br />
X(1) =<br />
! delete parameters (cleanup)
Y(1) =<br />
Z(1) =<br />
SEL(1) =<br />
I=<br />
NNODE=<br />
/GO<br />
! resume printout<br />
Cel de-al doilea exemplu numit bilinear.mac, evaluează tensiunile dintr-un model<br />
deja rulat static şi atribuie materialul 1 <strong>elemente</strong>lor supuse la întindere şi materialul 2<br />
<strong>elemente</strong>lor supuse la compresiune (aceste două materiale trebuie să <strong>fi</strong>e deja de<strong><strong>fi</strong>nite</strong> în model<br />
şi pot avea proprietăŃi diferite la întindere şi compresiune) apoi mai rulează problema pentru a<br />
corecta eventual selecŃia <strong>elemente</strong>lor şi soluŃia problemei. Acest macrou este util a <strong>fi</strong> rulat<br />
după rezolvarea unei analize statice. ARG1 este numărul de iteraŃii (implicit este 2).<br />
/nop<br />
_niter = arg1<br />
! set number of iterations<br />
*if,_niter,lt,2,then<br />
_Niter = 2<br />
*endif<br />
*do,iter,1,_niter ! loop on number of iterations<br />
/post1<br />
set,1,1<br />
*get,ar11,elem,,num,maxd ! Get number of elements<br />
*dim,_s1,,ar11<br />
! array for element s1<br />
*dim,_s3,,ar11<br />
! array for element s3<br />
etable,sigmax,s,1 ! s1 is in element table sigmax<br />
etable,sigmin,s,3 ! s3 is in element table sigmin<br />
*vget,_s1(1),elem,1,etab,sigmax ! get element maximum stress in<br />
s1<br />
*vget,_s3(1),elem,1,etab,sigmin ! get element minimum stress in<br />
s3<br />
*dim,_mask,,ar11 ! array for mask vector<br />
*voper,_mask(1),_s1(1),lt,0 ! true if max. stress < 0<br />
*v<strong>cu</strong>m,1<br />
! ac<strong>cu</strong>mulate compression elements<br />
*vabs,0,1<br />
! absolute value of s3<br />
*voper,_mask(1),_s3(1),gt,_s1(1) ! true if abs(minstr) > maxstr<br />
<strong>fi</strong>nish<br />
/prep7<br />
material mods<br />
mat,1<br />
properties<br />
emod,all<br />
! go to prep7 for element<br />
! set all materials to tension<br />
*vput,_mask(1),elem,1,esel ! select compression elements<br />
mat,2<br />
! change selected elements to compression<br />
emod,all<br />
esel,all<br />
<strong>fi</strong>nish<br />
_s1(1)=<br />
_s3(1)=<br />
_mask(1)=<br />
! select all elements<br />
! clean up all vectors (set to zero)
solve<br />
solve<br />
<strong>fi</strong>nish<br />
*enddo<br />
_niter=<br />
_iter=<br />
/gop<br />
! rerun the analysis<br />
! end of iterations<br />
! clean up iteration counters<br />
1.1.13. Aspecte de interfaŃă în lucrul GUI<br />
Atunci când se rulează un macrou în modul de lucru GUI, <strong>program</strong>ul ANSYS asigură<br />
o serie de facilităŃi suplimentare pentru lucrul <strong>cu</strong> macrouri. Astfel este posibil să:<br />
• Se introducă un parametru scalar de la tastatură folosind comanda *ASK;<br />
• Se creeze o fereastră de dialog pentru a introduce mai multe valori pentru o serie de<br />
parametri;<br />
• Se a<strong>fi</strong>şeze un mesaj folosind comanda *MSG;<br />
• Se selecteze anumite entităŃi <strong>cu</strong> ajutorul mousului;<br />
• Se deschidă orice fereastră de dialog.<br />
InformaŃii suplimentare legate de comenzile care lucrează <strong>cu</strong> parametri se găsesc în<br />
manualul APDL Programmer's Guide.
Exemplu simplu de optimizare pentru o grindă în consolă