Következő: 9.1.3 tcl/tk
Fel: 9.1.2 AWK mindenkinek
Előző: 9.1.2.1 Válogassunk!
  Index
Nézzünk egy picit bonyolultabb feladatot: készítsünk egy táblázatból három
másikat úgy, hogy
közben koordináta transzformációt végzünk, mértékegységet
váltunk és a táblázat oszlopainak
szélességét és sorrendjét is megváltoztatjuk
- mint ahogy bizonyára kitalálták - a táblázatokat bemenő adatként
felhasználó programok igényei szerint.
A kiinduló táblázat egy kristály elemi cellájában található 12 db. atom
koordinátáit tartalmazza - cellaméret egységekben. A mintának választott
kristály (Na2SO3) sajnos hexagonális, így a rendelkezésre álló koordináták
ferdeszögű koordinátarendszerben vannak megadva.
Az első eredményfájl úgynevezett XYZ adatfájl lesz, ami pl. az Xmol, Rasmol,
Molwin és hasonló
programok által felismert adatformátum. Ebben az Angströmben
megadott koordinátákat egy
kétsoros fejléc előzi meg (atomok száma és egy
címsor).
A második és a harmadik eredményfájl a DVscat nevű DV-Xa molekula modellező
programhoz
szükséges. Hogy ne unatkozzunk, a második eredményfájlban
derékszögű rendszerben és atomi
egységben kell megadni a koordinátákat, míg a
harmadikban - a bemenő fájlhoz hasonlóan - ferdeszögű rendszerben és cella
egységeket használva kell megadni az atomok pozícióját.
Táblázat:
A kiindulási adatsor (egy elemi cella két Na2SO3
egységet tartalmaz, s az egységcella oldalai: a = b = 5.4587 A; c=6.1792 A)
atom |
x/a |
y/b |
z/c |
S1 |
0.33333 |
0.66666 |
0.1730 |
S2 |
-0.33333 |
-0.66666 |
-0.1730 |
O3 |
0.1313 |
0.38200 |
0.2683 |
O4 |
-0.1313 |
-0.38200 |
-0.2683 |
O5 |
0.3820 |
0.25070 |
-0.2683 |
O6 |
-0.3820 |
-0.25070 |
0.2683 |
O7 |
0.2507 |
-0.1313 |
0.2683 |
O8 |
-0.2507 |
0.1313 |
-0.2683 |
Na9 |
0 |
0 |
0 |
Na10 |
0 |
0 |
0.5 |
Na11 |
0.33333 |
0.66666 |
0.66666 |
Na12 |
-0.33333 |
-0.66666 |
-0.66666 |
|
A feladatot az alábbi programocskával oldottam meg, melyet így kell futtatni:
awk -f so3.awk Na2SO3
ahol Na2SO3 a táblázatban kilistázott
adatokat tartalmazza (fejléc nélkül),
so3.awk az itt látható program, s az
eredmény pedig a Na2SO3.xyz,
Na2SO3.f05 és Na2SO3.f03 fájlokba kerül.
Az so3.awk program listája
#Átszámolja a hexagonális Na2SO3 kristály egy elemi cellájában
#levő atomok koordinátáit Descartes koordináta rendszerre.
# cx=cos 120 degs
# cy=sin 120 degs
# x,y,z ferdeszögű koordináták cella egységben
# xa,yb,zc Descartes koordináták (Angström egységekben)
# au konverziós faktor az atomi hosszegység és az Angström között
# cella méret: a=5.4587 A ; c=6.1792 A
#
# Az első rekord beolvasásakor végezzük el az inicializálásokat
# Ezek egyrészét a BEGIN szekcióba is tehettük volna,
# de a FILENAME változó ott még nem áll rendelkezésre!!!
NR==1 { a=5.4587; c=6.1792
cx=-0.5; cy=0.8660254
au=0.529177
# Háromféle adatfájlt készítünk
f1= FILENAME ".xyz"
f2= FILENAME ".f05"
f3= FILENAME ".f03"
# Az XYZ eredményfájl elejére fejlécet is írunk
print 12 > f1
print FILENAME " unit cell" >> f1
}
#
# Az alábbi műveleteket minden beolvasott rekordra elvégezzük
{
# A negtív koordinátákat eltolással a pozitív térnyolcadba transzformáljuk
x=$2; if (x<0) x=x+1
y=$3; if (y<0) y=y+1
z=$4; if (z<0) z=z+1
# Az egységcellát az origóra centráljuk
x=x-0.5
y=y-0.5
z=z-0.5
# A ferdeszögű koordinátákat derékszögűvé transzformáljuk
xa=(x+cx*y)*a
yb=y*cy*a
zc=z*c
# A koordinátákat és az atom nevét mindhárom fájlba kiírjuk
printf("%-4s %8.5f %8.5f %8.5f\n", $1,xa,yb,zc) >> f1
printf("%20.10E%20.10E%20.10E%5s\n", xa/au,yb/au,zc/au,$1) >> f2
printf("%20.10E%20.10E%20.10E%5s\n", x,y,z,$1) >> f3
}
12
Na2SO3 unit cell
Táblázat:
Az Na2SO3.xyz eredményfájl listája
S1 |
-1.36468 |
0.78786 |
-2.02060 |
S2 |
1.36468 |
-0.78786 |
2.02060 |
O3 |
-1.69056 |
-0.55783 |
-1.43172 |
O4 |
1.69056 |
0.55783 |
1.43172 |
O5 |
0.03630 |
-1.17853 |
1.43172 |
O6 |
-0.03630 |
1.17853 |
-1.43172 |
O7 |
-2.36717 |
1.74298 |
-1.43172 |
O8 |
2.36717 |
-1.74298 |
1.43172 |
Na9 |
-1.36468 |
-2.36369 |
-3.08960 |
Na10 |
-1.36468 |
-2.36369 |
0.00000 |
Na11 |
-1.36468 |
0.78786 |
1.02983 |
Na12 |
1.36468 |
-0.78786 |
-1.02983 |
|
Táblázat:
Az Na2SO3.f05 eredményfájl listája
-2.578863027E+00 1.488847700E+00 -3.818379106E+00 S1
2.578863027E+00 -1.488847700E+00 3.818379106E+00 S2
-3.194695518E+00 -1.054146337E+00 -2.705560975E+00 O3
3.194695518E+00 1.054146337E+00 2.705560975E+00 O4
6.859775652E-02 -2.227107474E+00 2.705560975E+00 O5
-6.859775652E-02 2.227107474E+00 -2.705560975E+00 O6
-4.473295807E+00 3.293760632E+00 -2.705560975E+00 O7
4.473295807E+00 -3.293760632E+00 2.705560975E+00 O8
-2.578863027E+00 -4.466721769E+00 -5.838500162E+00 Na9
-2.578863027E+00 -4.466721769E+00 0.000000000E+00 Na10
-2.578863027E+00 1.488847700E+00 1.946088874E+00 Na11
2.578863027E+00 -1.488847700E+00 -1.946088874E+00 Na12 |
|
|
|
|
Táblázat:
Az Na2SO3.f03 eredményfájl listája
-1.666700000E-01 1.666600000E-01 -3.270000000E-01 S1
1.666700000E-01 -1.666600000E-01 3.270000000E-01 S2
-3.687000000E-01 -1.180000000E-01 -2.317000000E-01 O3
3.687000000E-01 1.180000000E-01 2.317000000E-01 O4
-1.180000000E-01 -2.493000000E-01 2.317000000E-01 O5
1.180000000E-01 2.493000000E-01 -2.317000000E-01 O6
-2.493000000E-01 3.687000000E-01 -2.317000000E-01 O7
2.493000000E-01 -3.687000000E-01 2.317000000E-01 O8
-5.000000000E-01 -5.000000000E-01 -5.000000000E-01 Na9
-5.000000000E-01 -5.000000000E-01 0.000000000E+00 Na10
-1.666700000E-01 1.666600000E-01 1.666600000E-01 Na11
1.666700000E-01 -1.666600000E-01 -1.666600000E-01 Na12 |
|
|
|
|
Ez az oldal elérhető:
http://esca.atomki.hu/dlug/commodus/awk.html
698
Következő: 9.1.3 tcl/tk
Fel: 9.1.2 AWK mindenkinek
Előző: 9.1.2.1 Válogassunk!
  Index
1999-09-17