Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Programmer Manualul

Source: http://www.psicode.org/doc/progman/

T. Daniel Crawford, ^ $ A $C. David Sherrill, B ^ $ $Edward F. Valeev,$ ^ {A} $

Justin T. Fermann,^ $ C $ şi C. Brian Kellogg^ $ C $

^ $ A $Departamentul de Chimie, Virginia Tech, Blacksburg, Virginia 24061

B ^ $ $Centrul pentru Ştiinţă şi Tehnologie Computational Moleculara, Institutul de Tehnologie din Georgia, Atlanta, Georgia 30332-0400

^ $ C $Centrul pentru Computaţională Quantum Chimie, Universitatea din Georgia, Atena, Georgia 30602-2525

 

 

PSI3 Version: 3.4.0

Creat pe: 16 februarie 2009

Raport de bug-uri: psicode@users.sourceforge.net







Conţinut

Introducere

Suita de PSI ab initio cuantice programele de chimie este rezultatul o încercare în curs de desfăşurare de către un cadru de studenti absolventi, asociaţi post-doctoral, şi profesori pentru a produce cod care să fie eficientă, dar, de asemenea, uşor să se extindă la noi metode teoretice. Efort semnificativ a fost dedicată de dezvoltare a bibliotecilor, care sunt robuste si usor de utilizat. Unele dintre cele mai timpurii contribuţiilor la ceea ce acum este mentionat ca `` PSI''include o interacţiune directă de configurare (CI) program (Robert Lucchese, 1976, acum la Texas A & M), bine-cunoscut grup de programe grafice unitar CI (Bernie Brooks, 1977-1978, acum la NIH), cum şi originalul integralele codul (Russ Pitzer, 1978, acum de la Ohio State). Din 1978-1987, pachetul a fost, stiu ca BERKELEY suita, şi după grupul Schaefer sa mutat la Centrul de Chimie Computational Quantum de la Universitatea din Georgia, un pachet a fost redenumit PSI. Vă mulţumim în primul rând la eforturile de Curt Janssen (Sandia Labs, Livermore) şi Ed Seidl (LLNL), pachetul a fost portat la sistemele UNIX, şi în mod substanţial îmbunătăţit cu noi formate de intrare şi un C pe bază de I / O de sistem.

Început în 1999, un efort de extins a fost început să se dezvolte PSI3 - o PSI apartament cu o faţă complet nouă. Ca urmare a acestui efort, toate din moştenirea codul Fortran a fost eliminat, si totul a fost rescris în C şi C + +, inclusiv integrantă din nou integrantă / derivate, cuplate cu dispersie, şi codurile CI. În plus, noi I / O, bibliotecile au fost adăugate, cum şi un punct de control îmbunătăţit structura de fişiere şi automatizarea mai mare a sarcinilor tipice, cum ar fi optimizarea geometrie si analiza de frecvenţă. Pachetul are capacitatea de a determina wavefunctions, energii, degradeuri analitic, şi diverse proprietăţi moleculare bazate pe o varietate de teorii, inclusiv de spin-restrânse, spin-nerestricţionat, şi a restricţionat deschis-shell Hartree-Fock (RHF, UHF, şi ROHF) ; interacţiune de configurare (CI) (inclusiv o varietate de multireference CI şi completă CI); cuplate-cluster (CC), inclusiv CC, cu orbite variationaly optimizate în al doilea rând, pentru Møller-Plesset teoria perturbatiilor (MPPT), inclusiv în mod explicit corelat de ordinul doi Møller- Plesset energie (MP2-R12), şi completă-activ-spaţiu de auto-consistent câmp (CASSCF) teoria. Până în luna ianuarie 2008, toate de cod C în PSI3 a fost convertit la C + + pentru a permite o cale s mai orientat-obiect de design şi a unui cadru unic-excecutable care va facilita reutilizarea codului şi uşurinţa în eforturile de paralelizare. În acest moment acelaşi, toate din moştenirea I / O de la rutinele PSI2 au fost eliminate, raţionalizarea foarte mult libciomr.a bibliotecă.

Scopul acestui manual este de a oferi o privire de ansamblu rezonabil detaliată a codului sursă şi filozofia de programare a PSI3, astfel ca programatorii interesaţi şi de a contribui la codul va avea o sarcină mai uşoară.Secţiunea 2 oferă o explicaţie succint cu privire la măsurile necesare pentru a obţine codul sursă din depozitul principal de la Virginia Tech. (Instrucţiunile de instalare sunt zentate separat în manualul de instalare sau în $ PSI3/INSTALL.) Secţiunea 3 discută elementele esenţiale ale unui C-limbaj PSI3 programului, cu accent pe parsarea de intrare şi de I / O funcţii. Secţiunea 4 furnizează documente de o serie de alte biblioteci importante, inclusiv biblioteca de functii pentru citirea din dosar punctul de control, libchkpt.a, biblioteca Trio Quantum funcţia de diverse, libqt.a, libiwl.a pentru citirea şi scrierea cu una şi doi electroni integrale în integralele `` cu etichete''format. Secţiunea 5 oferă consiliere cu privire la stil de programare adecvate pentru PSI3 cod, şi pct. 6 descrie structura pachetului Makefile s. Secţiunea 6.3 oferă o scurtă zentare a măsurile necesare pentru adăugarea unui nou modul de a PSI3, pct. 7 oferă câteva sugestii depanarea la ea, şi secţiunea 8 explică convenţii pentru documentarea ea. Anexe furniza materialul de referinţă importante, inclusiv în zent Acceptăm PSI3 citare şi de informaţii format pentru unele dintre cele mai importante fişiere text folosite de PSI3 module.


PSI3 cod sursă

Sistemul de control Subversion (SVN) ( subversion.tigris.org ) oferă un mijloc convenabil prin care programatorii pot obţine cel mai recent (sau orice anterioară) versiune a PSI3 sursă din depozit principal sau o versiune sucursală, adăuga cod nou la sursa de copac sau modifica existente PSI3 module, şi apoi a face modificări şi completări la dispoziţia altor programatori prin verificarea modificărilor înapoi în depozit principal. SVN oferă de asemenea un''`` plasă de siguranţă în faptul că orice modificare eronată a codului poate fi uşor eliminate de îndată ce acestea au fost identificate. Această secţiune descrie modul de utilizare SVN pentru a accesa şi modifica PSI3 codul sursă. (Reţineţi că instrucţiunile de compilare şi instalare sunt zentate într-un document separat.)

Depozit principal pentru PSI3 Codul sursa este menţinută în zent de grupul Crawford de la Virginia Tech. Pentru a vedea codul, trebuie să obţină mai întâi un cont SVN prin e-mail crawdad@vt.edu. După ce au nume de utilizator şi parola-id, acum sunteţi gata pentru a accesa prin intermediul unui depozit securizat, SSL bazate pe conexiune WebDAV, dar mai întâi trebuie să decideţi ce versiune a codului care aveţi nevoie.

Depozitul SVN PSI3 conţine trei top-nivel de directoare:

Dacă aveţi un cont PSI3 SVN, puteţi citi cu atenţie aceste directoare, dacă doriţi, arătând browser-ul web la:

https://sirius.chem.vt.edu/svn/psi3/


PSI3 Politici SVN: Care clasificatorului Ar trebui sa folosesc?

PSI3 depozit este format dintr-un trunchi principal şi mai multe ramuri de să. Ramurii pe care ar trebui să utilizaţi depinde de tipul de munca pe plan pentru codurile:

  1. Pentru orice bucată de cod deja în cea mai recentă versiune, remedieri de erori (definit ca ceva care nu adaugă funcţionalitate - inclusiv actualizările de documentaţie) ar trebui să se facă numai pe ramura cea mai recentă versiune stabilă.
  2. Trunchiul principal este rezervat pentru dezvoltarea de noi funcţionalităţi. Acest lucru ne permite să păstraţi noul cod, eventual instabil departe de accesul publicului până la codul este gata.
  3. Cod care nu doriţi să pună în versiune majoră următoare a PSI3 ar trebui să fie pus pe o ramură separată de pe trunchiul principal. Veti fi singurul responsabil pentru întreţinerea noii sucursale, astfel încât ar trebui să citiţi manualul de SVN înainte de a încerca acest lucru.

Fig. 1 vede o schemă de revizuire SVN-Structura de control şi etichetare ramură. Două ramuri de să sunt zentate, ramura stabilă curentă, numit psi-3-4, şi o versiune viitoare planificate, pentru a fi numit psi-3-5. Etichetele de pe ramuri indică shapshots de să, în cazul în care bug-uri au fost imobilizate si codul a fost sau va fi exportate pentru distribuţie publică. Linii punctate în figura indică îmbinare puncte: chiar înainte de fiecare lansare publică, modificările aduse codului de pe ramura de să stabilă va fi îmbinate în trunchiul principal.

Figura 1: PSI3 SVN structura pe ramuri cu exemple de ramură şi-release-tag etichetare.
\ Begin {cifra} \ begin {center} \ {epsfig fişier = svn.eps, înălţime = 6.5 cm} \ end {center} \ end {figura}

O problemă des întâlnită este de ce să fac cu privire la repararea bug-urilor, care sunt necesare pentru dezvoltarea neîntreruptă a codului de cod de pe trunchiul principal. Deoarece articolul 1 al politicii statelor de mai sus, toate bug stabileşte de cod deja în versiune stabilă recentă trebuie să meargă pe ramura corespunzătoare, nu pe trunchi principal. Următorul pas depinde de severitatea bug-ul:

  1. În cazul în care repara bug-ul este critic şi afectează potenţial orice dezvoltator de cod de pe trunchiul principal, apoi PSI3 administratorii ar trebui să fie informaţi cu privire la fix. Dacă se consideră măsurile necesare, adecvate pentru a crea o versiune nou patch vor fi făcute. După lansarea patch-ul urmator este creat apoi rezolvă bug-uri vor fi îmbinate pe trunchiul principal. În cazul în care repara bug-ul nu se justifică o eliberarea imediată nou plasture, atunci aveţi posibilitatea să includă bug-fixa în copia locală a codului trunchiului principal manual sau cu ajutorul SVN caracteristici îmbinare. Acest lucru vă va permite să continue dezvoltarea de să până la următorul patch este creat şi repara bug-ul este încorporat în codul de trunchiul principal în depozit. Cu toate acestea, ar trebui să nu îmbinarea astfel de modificări în trunchiul principal de tine.
  2. În cazul în care repara bug-ul nu este critic (de exemplu, o actualizare a documentaţiei / fixa), atunci trebuie să aşteptaţi până la eliberarea patch viitor, când va fi îmbinate în trunchiul principal în mod automat.

Următoarele sunt câteva dintre comenzile cel mai frecvent utilizate SVN pentru verificarea şi actualizarea copiile de lucru ale PSI3 codului sursă.

$ \ Bullet $ Pentru a Plateste o copie de lucru a capului de trunchi principal:

svn co https://sirius.chem.vt.edu/svn/psi3/trunk/ psi3

$ \ Bullet $Pentru a vedea o copie de lucru a şefului unei sucursale de să specifice, de exemplu, ramura etichetate psi-3-4 :

svn co https://sirius.chem.vt.edu/svn/psi3/branches/psi-3-4 psi3

Reţineţi că ulterior actualizare svn comenzile din această copie de lucru va oferi actualizări doar pe ramura aleasă. Reţineţi, de asemenea, că după ce au verificat o copie proaspătă de lucru a codului trebuie să executaţiautoconf comandă pentru a genera un configura script pentru construirea codul. (A se vedea manualul de instalare pentru instrucţiuni de configurare, compilare, şi testare.)

Pentru fiecare dintre comenzile de mai sus, copia de lucru a codului va fi plasat în directorul psi3, indiferent de alegerea ta de sucursale. In acest manual, ne vom referi la acest director de pe acum ca $ PSI3. Comenzi ulterioare SVN sunt, de obicei, va rula în acest director, şi de nivel superior.

$ \ Bullet $ Pentru a actualiza copia dumneavoastră curent de lucru pentru a include cele mai recente revizuiri:

svn update

Note: (a) Aceasta va actualiza doar reviziile sucursala dvs. curent; (b) vechi -d si -P steaguri cerute de CVS nu sunt necesare cu SVN.

$ \ Bullet $ Pentru a converti copia dvs. de lucru la cap de o ramură specifice:

svn comutator https://sirius.chem.vt.edu/svn/psi3/branches/psi-3-4

$ \ Bullet $ Pentru a converti copia dvs. de lucru la cap a trunchiului principale:

svn comutator https://sirius.chem.vt.edu/svn/psi3/trunk/

$ \ Bullet $Pentru a afla ce ramură de copie de lucru este, în această rula dumneavoastră de top-nivel PSI3 directorul sursa:

informatiile meciului svn | grep URL

Aceasta va reveni directorul SVN de la care copia dvs. de lucru a fost luată, de exemplu,

URL: https://sirius.chem.vt.edu/svn/psi3/branches/psi-3-4

Câteva cuvinte de consiliere:

  1. Cele mai multe comenzi SVN sunt în mod rezonabil în condiţii de siguranţă,
  2. S deosebire de CVS, nu trebuie să utilizaţi svn update pentru a vedea starea de copia dumneavoastră de lucru. Cu SVN ar trebui să utilizaţi starea svn pentru a vedea dacă aţi modificat orice fişiere sau directoare. Dacă doriţi o comparaţie directă cu repozitoriu, trebuie să utilizaţi svn status-u.
  3. Citiţi manualul de SVN. Serios.
    http://svnbook.red-bean.com/
  4. Dacă sunteţi pe cale de a începe o dezvoltare semnificativă sau bug-remedieri, actualizaţi mai întâi copia de lucru la ultima versiune pe ramura. În plus, dacă faci de dezvoltare pe o perioadă lungă de timp (să zicem saptamani sau luni), pe un modul specific sau module, asiguraţi-vă că pentru a rula un svn status-u ocazional. În poate fi foarte frustrant pentru a încerca să verifice în o mulţime de schimbări, doar pentru a afla căPSI3 sa schimbat dramatic de la ultima actualizare.

Verificarea în modificată PSI3 executabile sau biblioteci

Dacă aveţi modificări Psi binare sau biblioteci care există deja, una din cele două serii de etape este necesar pentru a verifica aceste modificări pentru a depozit principal. Prima serie poate fi urmată în cazul în care toate modificările au fost făcute numai pentru fişiere care există deja în versiunea curentă. A doua serie ar trebui să fie urmată în cazul în care fişiere noi trebuie să fie adăugate la codul în depozit.

The svn ci comandă în ambele aceste secvenţe va examina toate din cod în actualul libciomr directorul împotriva versiunea curentă a codului din depozit principal. Toate fişierele care au fost modificate (şi pentru care nu intră în conflict cu versiunile mai noi exista!) Vor fi identificate şi verificate, în principal la depozit (ca şi fişier nou în a doua situaţie).

SVN vă cere să includă un comentariu la modificările. Cu toate acestea, s deosebire de CVS, SVN feră ca ai pus comentariile dumneavoastră cu privire la linia de comandă, mai degrabă decât editarea unui fişier text.Eu fer modul în CVS, dar aceasta este o durere minore în comparaţie cu toate avantajele de SVN, în opinia mea.


Adăugarea de cod complet nou la principalele PSI3 depozit

În cazul în care programator este adaugarea unui modul executabil nou sau bibliotecă pentru a PSI3 depozit, o serie de convenţii importante ar trebui să fie urmate:

  1. Întrucât astfel de modificări implică aproape întotdeauna funcţionalitate suplimentară, noi module sau biblioteci ar trebui să fie adăugate numai pe trunchi SVN principal. A se vedea pct. 2.1 pentru informaţii suplimentare.
  2. Directorul care conţine noul cod ar trebui să fie dat un nume care se potriveşte cu numele de cod instalate (de exemplu, în cazul în care codul va fi instalat ca newcode, directorul care conţine codul ar trebui să fie numit newcode ). Noi module executabil trebuie să fie introduse în $ PSI3/src/bin şi biblioteci în $ PSI3/src/lib a exemplarului de lucru ale utilizatorului.
  3. Makefile ar trebui să fie convertite la un fişier de intrare pentru scriptul configure ( Makefile.in - a se vedea la oricare dintre actuale PSI3 binare pentru un exemplu) şi trebuie să respecte convenţiile înfiinţate în toate din actualul PSI3 Makefiles. Aceasta include utilizarea de MakeVars şi MakeRules.
  4. New binare ar trebui să fie adăugate la lista conţinută în PSI3/src/bin/Makefile.in $, astfel încât acestea vor fi compilate în mod automat atunci când o compilaţie completă a PSI3 de distribuţie are loc. Acest pas este inclusă în ordinea de mai jos.
  5. O pagina pentru documentaţia ar trebui să fie inclusă în noul cod (a se vedea secţiunea 8 pentru mai multe informaţii). Ca regulă generală, în cazul în care codul nu este gătită să aibă o pagină de documentare, acesta nu este gata pentru a fi instalate în PSI3.
  6. The configure.ac Dosarul trebuie să fie modificată, astfel încât utilizatorii pot verifica exemplare din noul cod şi, astfel încât să configuraţi script-ul va şti să creeze Makefile pentru noul cod. Aceste măsuri sunt incluse în ordinea de mai jos.

Să supunem că noul cod este un modul executabil şi este numit great_code. Directorul ce conţine noul cod trebuie să conţină numai acele fişiere care urmează a fi verificate pentru a depozitul! Apoi, următorii paşi va verifica într-o nouă piesă de cod pentru a depozitului principal:

  1. CD-ul $ PSI3/src/bin
  2. svn adăuga great_code
  3. svn ci-m `` Pune comentariile aici.''
  4. CD-ul $ PSI3
  5. Edit configure.ac şi se adaugă great_code la lista.
  6. svn ci-m configure.ac `` Pune comentariile aici.''
  7. autoconf
  8. CD-ul $ PSI3/src/bin
  9. Edit Makefile.in şi se adaugă great_code la lista.
  10. svn ci-m Makefile.in `` Pune comentariile aici.''
În acest moment, toate din Codul a fost verificate în mod corespunzător, dar trebuie să testaţi, de asemenea, să vă asiguraţi că acest cod poate fi verificat de către alţi programatori, şi că va compila corect. Următorii paşi vor păstra versiunea dvs. personală a codului, a verifica afară noul cod, şi de testare-compilare:
  1. CD-ul $ PSI3/src/bin
  2. mv great_code great_code.bak
  3. cd $ PSI3 /..
  4. svn update
  5. CD-ul $ objdir
  6. $ PSI3/configure - fix = $ fix
  7. cd src / bin / great_code
  8. make install
(Reţineţi că objdir $ $ fix şi pentru directoarele de instalare şi compilarea definite în PSI3 instrucţiunile de instalare.) Versiunea dvs. originală a codului rămâne sub great_code.bak, dar ar trebui să fie nu mai este necesară în cazul în care paşii de mai sus de lucru. Reţineţi că este necesar să se re-rula configura în mod explicit, în loc să execute doar config.status, deoarece acesta din urmă nu conţine informaţii des noul cod.

Actualizarea cod verificat

În cazul în care codul din depozitul principal a fost modificat, copii altor utilizatori de lucru nu va fi, desigur, actualizate automat. În general, este necesar doar pentru a executa următorii paşi în vederea actualizării complet copia dumneavoastră de lucru de cod:

  1. CD-ul $ PSI3
  2. svn update

Acest lucru va examina fiecare intrare în copia dvs. de lucru şi comparaţi-o cu cea mai recentă versiune în depozitul principal. Când fişierul în depozit principal este mai recentă, versiunea dvs. de cod va fi actualizat. Dacă aţi făcut modificări la versiunea dvs., dar versiunea în depozitul principal nu sa schimbat, codul modificate vor fi identificate la tine cu un M ``''. Dacă aţi făcut modificări la versiunea dvs. a codului, şi una sau mai multe versiuni mai noi au fost actualizate în depozit principal, SVN va examina cele două versiuni şi încercarea de a le îmbina - acest proces dezvăluie adesea conflicte, cu toate acestea, şi este, uneori, tenţii. Veţi fi notificat cu privire la orice conflicte care apar (etichetate cu un `` C''), şi trebuie să le rezolve manual.

Dacă directoare noi au fost adăugate la depozitul, actualizarea de mai sus se va adăuga în mod automat le pentru a copia dvs. de lucru. Cu toate acestea, este posibil să trebuiască să re-rula autoconf şi configurarea ( $ objdir / config.status-verificaţi din nou este o comandă convenabil) pentru a putea construi noul cod.

Scoaterea din Codul de depozit

În cazul în care modificările de biblioteci sau binare sub Psi implică ştergerea fişierelor codul sursă din cod, acestea trebuie să fie în mod explicit eliminate prin SVN.

Următorii paşi se va elimina un fişier cod sursă numit bad_code.F dintr-un modul binar denumit great_code :

  1. CD-ul $ PSI3/src/bin/great_code
  2. svn eliminarea bad_code.F
  3. svn ci-m `` Pune comentariile aici.''

Verificarea din versiuni mai vechi ale codului

Uneori este necesar pentru a verifica versiunile mai vechi de o bucată de cod. Să supunem că dorim pentru a verifica o versiune veche de detci. Dacă acesta este cazul, următoarele etape va face acest lucru:
  1. CD-ul $ PSI3/src/bin/detci
  2. svn co-revizuire {2002-02-17}

Aceasta va verifica depozitul principal şi a vă oferi codul asa cum era exact pe 17 februarie 2002.

Examinând istoria revizuirea

Ea poate fi foarte util să folosiţi sistemul CVS pentru a vedea ce schimbări recente au fost aduse codului. Oricand un controale într-o versiune nouă a unui fişier, SVN cere utilizatorului să furnizeze observaţii cu privire la modificările cu -m de pavilion. Aceste observaţii du-te intr-un jurnal de informaţii care pot fi uşor accesate prin SVN. Pentru a vedea ce modificări au fost făcute recent la dosar detci.cc, s-ar intra în detci directorul sursa şi tipul de <>svn log detci.cc Verificarea fişierele jurnal este un mod foarte util pentru a vedea ce schimbări recente ar putea fi cauza probleme noi cu codul.


Structura PSI3 copac Source

Copia dvs. de lucru a PSI3 codul sursă include o serie de subdirectoare importante:

După compilare şi instalare, $ fixul directorul conţine codurile executabile şi alte fişiere necesare. NB: fişiere în acest domeniu nu ar trebui să fie modificată în mod direct, ci mai degrabă, copie de lucru ar trebui să fie modificate şi PSI3 Makefile ierarhie ar trebui să se ocupe de instalare de orice modificări. Structura din zona de instalare este:


Fundamentale PSI3 Funcţii

Fiecare PSI3 modul (de exemplu, cscf ) trebuie să îndeplinească două sarcini specifice, indiferent de scopul modulului individuale specifice (e): (1) obţinerea de opţiuni de ghidul de intrare şi (2) scris şi lectură din fişiere binare (de exemplu, fişierul de punctul de control). PSI3 programe scrise în limbajul de programare C face uz de două biblioteci care oferă toate instrumentele necesare pentru a îndeplini aceste funcţii: În plus, bibliotecile libciomr.a şi libqt.a oferă funcţii importante pentru alocare de memorie, matematica, şi codul de sincronizare. În secţiunea următoare, vom discuta des componentele de bază ale unei PSI3 C-limbaj de programare, urmată de descrieri detaliate ale parsare de intrare şi bibliotecile I / O.


Structura unei PSI3 Modul

Pentru a funcţiona ca parte a pachetului PSI, un program trebuie să includă anumite elemente necesare. Această secţiune va discuta des fişierele antet, variabile globale, şi funcţiile necesare pentru a integra un nou modul de C + + în PSI3. Aici este un minim PSI3 program, ale cărui elemente sunt descrise mai jos. Reţineţi că suntem folosind C + +, pentru a evita namespaces nume contradictorii între module, cum ne mişcăm s un design single-executabil. Cu toate acestea, din motive de moştenire globals anumite gprgid () funcţie trebuie să aibă C-legatura.

<> # Include <cstdio> # include <cstdlib> # include <libipv1/ip_lib.h> # include <psifiles.h> # include <libqt/qt.h> # include <libciomr/libciomr.h> # include <libchkpt / chkpt h>. # include <libpsio/psio.h> extern "C" { FILE * infile, * outfile; char * psi_file_fix; } / / începe modul specific namespace spaţiu de nume psi {spaţiu de nume MODULE_NAME { / / variabile globale, declaraţiile funcţiilor, şi / / # define situaţiile aici }} / psi Spaţiu de nume / închide:: MODULE_NAME / / principal trebuie să fie în spaţiul de nume la nivel mondial / / dar dau acces la PSI:: namespace MODULE_NAME folosind psi Spaţiu de nume:: MODULE_NAME int main (int argc, char * argv []) { psi_start (& infile, şi outfile, şi psi_file_fix, argc-1, argv +1, 0); ip_cwk_add (": MODULE_NAME"); / / MODULE_NAME toate capace aici psio_init (); psio_ipv1_config (); / * pentru a începe cronometrarea, tstart (outfile); * / / * Cod Introdu aici * / / * să se încheie cu calendarul, tstop (outfile); * / psio_done (); psi_stop (infile, outfile, psi_file_fix); } / / acest trebuie să fie spaţiul de nume la nivel mondial, de asemenea, extern "C" { char * gprgid (void) { char * prgid = "MODULE_NAME"; retur (prgid); } } / / toate celelalte lucruri sunt într-un spaţiu de nume special psi spaţiul de nume {{MODULE_NAME spaţiu de nume / / alte chestii de mai jos some_function dublu (int x) { / / codul } }} / / psi Spaţiu de nume aproape:: MODULE_NAME

În exemplul de mai sus, am inclus tipic C + + şi fişierele PSI antet, deşi pentru modul dumneavoastră specifice ar putea să nu nevoie de toate acestea, sau poate aveţi nevoie de cele suplimentare (cum ar fi string.h saumath.h ). ISP includ fişierelor utilizate în acest exemplu sunt libipv1/ip_lib.h (parser-ul de intrare, descrisă la punctul 3.2 ), psifiles.h (definiţiile din toate numerele de fişier PSI pentru I / O), libqt / qt.h(pachetul ` `cuantic trio-ul''biblioteca, care conţin matematica diverse şi funcţii utilitare), libciomr / libciomr.h (PSI vechi I / O si matematica rutine de bibliotecă - deşi nu conţine nici I / O mai), libchkpt / chkpt.h (într-o bibliotecă pentru accesarea fişierului punctul de control pentru a obţine cantităţi, cum ar fi CSA sau energia nucleară repulsie), şi libpsio / psio.h (PSI I / O bibliotecă, vezi pct. 3.3 ). Acestea includ fişiere conţin declaraţiile funcţiilor pentru toate funcţiile cuprinse în aceste biblioteci.

Reţineţi că toate modulele ISP necesită trei variabile globale cu C legătură (de exemplu, in interiorul unei extern C declaraţie): infile, outfile, şi psi_file_fix. Fiecare modul PSI trebuie să aibă, de asemenea, o funcţie de legătura C-numita gprgid () definite după cum se arată. The main () funcţia trebuie să fie în domeniul de aplicare la nivel mondial, şi alte funcţii ar trebui să fie în interiorul un spaţiu de nume cu numele modulului (care este mai departe, conţinute în interior un psi namespace). Consultati un C + + carte dacă nu sunteţi familiarizat cu spaţii de nume.

Funcţia întreg main () trebuie să fie capabil să se ocupe de linie de comandă argumentele cerute de PSI3 biblioteci. În special, toate PSI3 modulele trebuie să fie în măsură să treacă la funcţia psi_start () pentru argumentele de intrare de utilizator şi numele de fişiere de ieşire, cum şi un fix fişier la nivel mondial pentru a fi utilizate pentru a numi binar standard şi fişiere de date de text. (NB: nume implicite pentru intrare şi de ieşire sunt ghidul de input.dat şi output.dat., respectiv, deşi orice nume poate fi folosit) standardul actual pentru argumente de linie de comandă este pentru toate argumentele module specifice ( de exemplu, -liniştită, utilizate în detci ) înainte de intrare, ieşire, şi valorile fix. Psi_start () funcţia se aşteaptă pentru a găsi doar aceste ultime trei argumente la cele mai multe, astfel încât programator ar trebui să treacă caargv [] pointer la primul non-modulul specifice argument. Exemplul de mai sus este adecvat pentru o PSI3 modul care nu necesită în linia de comandă argumente în afară de globals de intrare / ieşire / fix. A se vedeaPSI3 module de intrare şi detci pentru mai multe exemple sofisticate. Argumentul final psi_start () este un număr întreg a căror valoare indică dacă fişierul de ieşire ar trebui să fie overwitten (1) sau anexate (0).Cele mai multe PSI3 module ar trebui să alegeţi să le adăugaţi.

The psi_start () initializeaza functia de intrare de utilizator şi fişierele de ieşire şi stabileşte variabile globale infile, outfile, şi psi_file_fix, bazate pe (în ordinea priorităţii) de mai sus de linie de comandă argumente sau variabilele de mediu PSI_INPUT, PSI_OUTPUT, şi PSI_FIX. Valoarea fix fişier la nivel mondial poate fi, de asemenea, specificate în fişierul de intrare al utilizatorului. Psi_start () Funcţia va iniţializa, de asemenea, analizorul de intrare şi să instituie un copac cuvânt cheie implicit (descris în detaliu în secţiunea 3.2 ). Acest pas este necesar, chiar dacă programul nu va face nici o parsare de intrare, deoarece unele dintre funcţionalitatea parser-ul de intrare este asumată de către libciomr.a şi libpsio.a. De exemplu, deschiderea unui fişier binar prin psio_open () (a se vedea pct. 3.3 ) impune parsarea fişierelor secţiunea de intrare al utilizatorului, astfel încât un număr de unităţi (de exemplu, 52) poate fi tradus intr-un nume de fişier. Psi_stop () funcţia inchide parser de intrare şi închide ghidul de intrare şi de ieşire fişiere.

Informaţii de sincronizare (atunci când programul porneşte şi oşte, şi cât de mult de utilizare, de sistem, şi de perete, ceas de timp o cere), pot fi imprimate pe fişierul de ieşire prin adăugarea de apeluri la tstart () şitstop () (de la libciomr.a ).

Unicul scop al funcţiei simplu gprgid () este de a oferi parser de intrare un mijloc de a determina numele a programului actual. Acest lucru permite parser-ul de intrare pentru a adăuga numele programului la copac cuvinte cheie de intrare parsarea. Această funcţie este folosită de libpsio.a, deşi funcţionalitate le oferă este foarte rar folosit.

În toate, dar cele mai triviale de module, va trebui probabil să împartă codul în mai multe fişiere. PSI3 convenţie este de a pune main () funcţia, gprgid (), cum şi alocarea de infile, outfile, şipsi_file_fix într-un fişier cu acelaşi nume ca cel al modulului (şi o extensie. cc). Alte C + + fişierele sursă ar trebui să aibă tot învelite în cadrul PSI:: MODULE_NAME namespace. Orice fişierele module specifice antet ar trebui să arate acest lucru:

<># Ifndef _psi_src_bin_MODULE_NAME_h # define _psi_src_bin_MODULE_NAME_h / / dacă aveţi nevoie de infile, outfile, şi psi_file_fix în antet, / / le includ ca aceasta: extern "C" { FILE * infile extern, * outfile; extern char * psi_file_fix; } psi spaţiul de nume { namespace MODULE_NAME { / * chestii antet merge aici * / }} / psi / Spaţiu de nume:: MODULE_NAME # endif / / header de paza

Dacă adăugaţi infile, etc, într-un fişier antet, asiguraţi-vă că acestea sunt într-o extern "C", declaraţia şi în spaţiul de nume la nivel mondial. Deoarece aceste variabile sunt definite în MODULE_NAME.cc, ar trebui să ceadă, de asemenea, aceste variabile cu externi pentru a spune compilatorului care le-au fost alocate în alt modul (de exemplu, FILE * infile extern ). Cu toate acestea, înseamnă că tu, atunci nu ar fi în măsură să includă, în care fişierul header MODULE_NAME.cc, pentru că atunci ai fi spune compilatorului că ambele infile, etc, sunt alocate în altă parte (în conformitate cu FILE extern * infile în fişierul header ) şi, de asemenea, că este alocată în fişierul curent ( FILE * infile în MODULE_NAME.cc), un contradition evident. Cele mai multe dintre oficiale PSI3 modulele folosi un truc sau undefining definirea unei variabile numiteEXTERN pentru a evita acest paradox aparent şi pentru a permite utilizarea a fişierului acelaşi antet care conţin variabilele globale (adesea numit globals.h ) în MODULE_NAME.cc şi toate celelalte C + + fişierele sursă.

Ca întotdeauna, vă sunt încurajate, pentru a evita utilizarea variabilelor globale atunci când este posibil, la toate. Se obişnuieşte să se încheie variabile care altfel ar fi la nivel mondial în structuri de date, cum ar fi MOInfo (pentru lucruri cum ar fi numărul de orbitali) şi Params (pentru parametrii specificate de utilizator). În următoarea etapă de dezvoltare a PSI, aceste structuri frecvent utilizate de date vor fi standardizate ca noul C + + obiecte pentru codul de maximă re-utilizare şi flexibilitatea.


Intrare Parser

The parsarea Biblioteca de intrare este construit cu scopul de a lectură în conţinutul unui fişier de intrare, cu sintaxa de input.dat şi stocare a conţinutului specific anumite cuvinte cheie furnizate. Pentru a efectua o astfel de sarcină libipv1.a are trei părţi: (1) parser; (2) scanerului lexicale; (3) Depozit de cuvinte cheie şi regăsire.

Formatul de input.dat urmează anumite norme care ar trebui, probabil, menţionate în continuare PSI gramatica de intrare. Există o descriere de cele mai multe dintre aceste norme în PSI3 manualul de utilizare. O definiţie completă a gramaticii de intrare PSI este codat în parse.y (vezi mai jos). Pentru a citi o gramatica avem nevoie de un parser - prima componentă a libipv1.a. Apoi a identificat elemente lexicale ale input.dat (cuvinte cheie şi valori de cuvânt cheie) trebuie să fie scanate pentru zenţa `` interzise''caractere (de exemplu, un spaţiu nu poate fi o parte dintr-un şir cu excepţia cazului în şir este plasat între paranteze). Această sarcină este efectuată de către scanner lexical - a doua componentă a libipv1.a. În cele din urmă, scanate în perechi de cuvinte cheie-valoare (e) sunt stocate într-o structură ierarhică de date (un copac). Atunci când o astfel de opţiune este necesară, set de cuvinte cheie şi valori stocate este cautat pentru o întrebă şi valoarea returnată. În acest fel, opţiunile de tip diferite pot fi atribuite, adică, mai degrabă decât având o linie de numere întregi, fiecare corespunzând unei variabile program, mnemonic variabile sir de caractere poate fi analizat şi intertat în variabile program. Este, de asemenea, mai uşor să pună în aplicare opţiunile implicite, permiţând o punte de intrare mai spartan. Setul de intrare-parsare rutine în libipv1.a nu este foarte complicat de folosit, dar modul în care sunt stocate datele este oarecum dureros să înţeleagă la început.

Următoarea este o listă a numelor de fişierele sursă individuale în libipv1 şi un rezumat al conţinutului acestora. După ce că este o listă de sintaxa de funcţii specifice şi utilizarea acestora. Ultima este o ilustrare simplă de utilizare a acestei biblioteci, luat cea mai mare parte din cscf.

Fişiere sursă

Sintaxă

ip_cwk.cc

ip_cwk_clear nule ();
Şterge cuvântul cheie curent de lucru. Utilizat atunci când iniţializarea de intrare sau de trecerea de la o secţiune la alta (: DEFAULT şi: CSCF la: INTCO, de exemplu).

void ip_cwk_add (char * KWD);
Adaugă KWD la lista de cuvinte cheie curente de lucru. Permite parsarea de variabile în cadrul acelui cuvânt cheie din fişierul de intrare (fişierele), care a (au) fost citit sau vor fi citite în viitor cu ajutorul ip_append. Cuvântul cheie KWD poate fi doar scos din lista de cuvinte cheie curent de lucru prin purjarea intreaga lista folosind ip_cwk_clear. Trebuie să se asigure că acestea şiruri de cuvinte cheie încep cu un colon.

ip_data.cc

int ip_count (char * KWD, int count *, int n);
Numără elementele în elementul n'th al matricei KWD.

int ip_boolean (char * KWD, int * bool, int n);
Parcurge elementul n'th de KWD ca boolean (true, 1, da, false, 0, nu) în 1 sau 0 returnate în bool.

int ip_exist (char * KWD, int n);
Returnează 1 dacă elementul n'th de KWD există. Din păcate, n trebuie sa fie 0.

int ip_data (char * KWD, char * conv, void * valoare, int n [, int O1,..., int pe]);
aşteaptă pentru cuvinte cheie KWD, găseşte valoarea asociate cu acesta, îl converteşte în conformitate cu caietul de sarcini format dat în conv, şi stochează rezultatul în valoare. Reţineţi că valoarea este un void * astfel încât această rutină se poate ocupa orice tip de date, dar este responsabilitatea programatorului de a se asigura că indicatorul a trecut la această rutină este de tip pointer corespunzătoare pentru datele. Valoarea găsită de către parser de intrare depinde de valoarea n, cum şi orice argumente suplimentare opţionale. n este numărul de argumente suplimentare. Dacă n este 0, atunci nu există argumente suplimentare, şi cuvânt cheie are numai o singură valoare asociate cu aceasta. În cazul în care cuvântul cheie are o matrice asociat cu ea, atunci n este 1, iar argumentul care este o altă componentă a matrice pentru a alege. Dacă KWD specifică o serie de tablouri, atunci n este de 2, primul argument suplimentar este numărul de matrice în primul rând, şi al doilea argument este numărul elementului în cadrul acestei matrice, etc adâncime în aici, codul numeşte sscanf (a se citi, conv, valoare);, asa ca asta e adevaratul sens al variabilelor.

int ip_string (char * KWD, char ** valoare, int n, [int O1,..., int pe]);
analizează şirul asociate cu KWD îl stochează în valoare. Rolul de n argumente şi opţionale este acelaşi cu cel descris mai sus pentru ip_data ().

int ip_value (char * KWD, ip_value_t ** ip_val, int n);
Grabs secţiunea de copac cuvinte cheie la KWD şi îl stochează în ip_val pentru utilizarea programatorului - acest lucru nu este de obicei folosit, din moment ce aveţi nevoie pentru a înţelege structura de ip_value_t.

int ip_int_array (char * KWD, int * ARR, int n);
Citeşte întregi n în matrice ARR.

ip_read.cc

void ip_set_uppercase (int uc);
Seturi parsarea sensibile la caz dacă uc == 0, cred.

nule ip_initialize (FILE * in, FILE * out);
solicită yyparse (); urmate de ip_cwk_clear (); urmate de ip_internal_values ();. Aceasta rutina citeste pachetul de intrare întregul şi îl stochează în structura de cuvinte cheie pentru acces mai târziu.

nule ip_append (FILE * in, * out FILE);
acelasi lucru ca ip_initialize ();, cu excepţia acest lucru nu şterge cwk primul. Utilizate pentru parsarea-un alt fişier de intrare, cum ar fi intco.dat.

ip_done nule ();
elibereaza copac cuvinte cheie.

ip_read.cc

nule ip_print_tree (FILE * stele, ip_keyword_tree_t * copac);
afiseaza copac la stele. Dacă pomul este setat la NULL, apoi copac curent cuvântul cheie de lucru vor fi imprimate. Această funcţie este utilă pentru depanarea problemelor cu parsarea.

Utilizarea de propoziţii din cscf

Acestea sunt două bucăţi uşor simplificate a (versiunile anterioare ale) codul actual.

De la cscf.cc :

<># Include <libipv1/ip_lib.h> # include <libpsio/psio.h> int main (int argc, char * argv []) { folosind PSI Spaţiu de nume:: cscf;... psi_start (& infile, şi outfile, şi psi_file_fix, argc -1, argv +1, 0); ip_cwk_add (": CSA");

De la scf_input.cc :

<> errcod = ip_string ("LABEL", & alabel, 0); dacă (errcod == IPE_OK) fprintf (outfile, "label =% s \ n", alabel); reordr = 0; / * aceasta setează implicit care vor fi utilizate în cazul în care utilizatorul nu a specificat acest cuvânt cheie * / errcod = ip_boolean ("reordona", & reordr, 0); dacă (reordr) { errcod = ip_count ("MOORDER", si dimensiune, 0); pentru (i = 0; i <size; i + +) { errcod = ip_data ("MOORDER", "% d", & iOrder [i], 1, i); errchk (errcod, "MOORDER"); } } second_root = 0; dacă (twocon) { errcod = ip_boolean ("SECOND_ROOT", & second_root, 0); } dacă (iopen) { errcod = ip_count ("SOCC", si dimensiune, 0); if (! errcod == IPE_OK & & size = num_ir) { fprintf (outfile, "\ matrice n SOCC este dimensiunea greşită \ n "); fprintf (outfile, "este% d, ar trebui să fie% d \ n", dimensiune, num_ir); exit (1); } ! dacă (errcod = IPE_OK) { fprintf ( outfile, "\ n încercaţi să adăugaţi câteva prietene de electroni \ n"); fprintf (outfile, "nevoie de SOCC \ n"); ip_print_tree (outfile, NULL); exit (1); }


Binary Input / Output System

Structura şi filosofie a bibliotecii

Aproape toate PSI3 modulele trebuie să facă schimb de date cu binare brute (numite, de asemenea, `` acces direct'') fişiere. Cu toate acestea, mai degrabă decât folosind low-level C, Fortran sau funcţii, cum ar fi read ()sau a scrie (), PSI3 utilizează un sistem flexibil, dar sistemul rapid I / O, care oferă control programator si ghidul de peste organizarea şi stocarea datelor. Unele dintre caracteristicile PSI I / O de sistem, libpsio, includ:

Structura TOC de fişiere binare PSI provdes mai multe avantaje de peste mari I / O sisteme. De exemplu, poziţiile de date din cuprins sunt identificate prin şiruri de cuvinte cheie (de exemplu, "Energie nucleară Repulsion" ) şi la nivel mondial a adresa o intrare este cunoscut doar de cuprins în sine, nu la programator. Prin urmare, în cazul în care programatorul doreşte să citească sau să scrie o intrare cuprins întreg, el / ea este obligată să furnizeze numai cuvinte cheie TOC şi mărimea de intrare (în bytes) pentru a obţine date. În plus, TOC face posibilă citirea doar bucăţi de intrări TOC (spun un singur tampon de o listă mare de doi electroni integralele), prin furnizarea corespunzătoare de cuvinte cheie TOC, o dimensiune, şi o adresă de pornire în raport cu începutul TOC de intrare. Pe scurt, design-TOC ascunde toate informaţiile des structura globală a fişierului acces direct de la programator şi permite el / ea să fie ocupat doar cu structura de intrările individuale. Curentul TOC este scris la sfârşitul fişierului atunci când este închis.

Astfel, fişierul de acces direct în sine este privit ca o serie de pagini, fiecare dintre care conţine un număr identic de octeţi. Adresa la nivel mondial de la începutul anului o intrare dat este stocat pe TOC ca o pereche pagină / compensa compus din pagina de pornire şi de octet de compensare pe acea pagină în cazul în care datele reşedinţa. Pagina de intrare-relativă / compensare adrese pe care programatorul trebuie să ofere de lucru, în exact acelaşi mod, dar poziţia 0 / 0 este considerată a fi începutul intrării cuprins, mai degrabă decât la începutul fişierului.

Interfaţa cu utilizatorul

Toate funcţiile necesare pentru a efectua de bază O I / sunt descrise în această subsecţiune. Declaraţiile corectă a acestor rutine sunt furnizate de către fişierul header psio.h. Reţineţi că înainte de orice funcţii de deschidere / inchidere poate fi numit, parsarea bibliotecă de intrare, libipv1 trebuie să fie iniţializat, astfel încât necesare micşioare, informaţiile des fişiere pot fi citite din date introduse de utilizator, dar acest lucru este ascuns de programator în funcţii de nivel inferior. NB, ULI este folosit ca o abreviere pentru int nesemnate lung în restul acestui manual.

psio_init int (void) : Înainte de orice fişiere pot fi deschise sau de bază de scriere / citire funcţiile de libpsio pot fi utilizate, datele globale necesare de către funcţii de bibliotecă trebuie să fie iniţializat folosind această funcţie.

psio_ipv1_config int (void) : Pentru biblioteca să funcţioneze în mod corespunzător, configuraţia acestuia trebuie să fie citit din fisierul de intrare sau de la utilizator psirc. fişier. Acest apel trebuie să urmeze imediatpsio_init int ();.

psio_done int (void) : Atunci când toate interacţiune cu fişierele de acces direct este completă, această funcţie este utilizată pentru a elibera memoria bibliotecii globale.

int psio_open (ULI unitate, statutul de int) : Deschide fişierul accesul direct identificate de către unitate. Starea de pavilion este un boolean utilizată pentru a indica dacă fişierul este nou (0) sau în cazul în care există deja şi este în curs de re-deschis (1). Daca este specificat in fisierul de intrare utilizatorului, fisierul va fi deschis automat ca un multi-(dungi) fişier, şi fiecare pagină de date va fi citit de la sau în scris la fiecare volum în succesiune.

int psio_close (ULI unitate, int păstra) : închide un fişier de acces direct identificate de către unitate. Drapelul păstra este un boolean utilizată pentru a indica dacă volumele fişierul ar trebui să fie eliminat (0) sau reţinute (1) după ce a fost închis.

int psio_read_entry (ULI unitate, char * cheie, char * buffer, ULI dimensiune) : Folosit pentru a citi întregul cuprins o intrare identificate de către şir tasta de unitate în matrice tampon.Numărul de octeţi care urmează să fie citit este dat de marimea, dar această valoare este utilizat numai pentru a se asigura că cererea citeşte să nu depăşească sfârşitul intrării. Dacă intrarea nu există, o eroare este tipărită pe masura, iar programul va ieşi.

int psio_write_entry (ULI unitate, char * cheie, char * buffer, ULI dimensiune) : Folosit pentru a scrie o intrare întregul cuprins idenitified de şirul tasta pentru unitate în matrice tampon.Numărul de octeţi care urmează să fie scrise este dat de marimea. În cazul în care există deja de intrare şi datele sale se suprascrise, valoarea de dimensiune este utilizată pentru a se asigura că cererea a scrie să nu depăşească sfârşitul intrării.

int psio_read (ULI unitate, char * cheie, char * buffer, ULI dimensiune, psio_address Sadd, psio_address * eadd) : Folosit pentru a citi un fragment de dimensiuni bytes de o intrare de cuprins dat identificate de cheie de la unitate în matrice tampon. Adresa de pornire este dat de Sadd şi adresa final (care este, adresa de intrare-relativă a octet următoare în fişierul) este returnat în * eadd.

psio_write int (ULI unitate, char * cheie, char * buffer, ULI dimensiune, psio_address Sadd, psio_address * eadd) : Folosit pentru a scrie un fragment de dimensiuni bytes de o intrare de cuprins dat identificate de -cheie pentru unitate în matrice tampon. Adresa de pornire este dat de Sadd şi adresa final (care este, adresa de intrare-relativă a octet următoare în fişierul) este returnat în * eadd.

Pagina de / diferenţa de perechi adresa cerute de citire cedent şi a scrie funcţiile sunt furnizate prin intermediul variabile de tipul de date psio_address, definite prin:

<> typedef struct { ULI pagina; ULI de compensare; } psio_address; The PSIO_ZERO definit într-o macrocomandă oferă o intrare convenabil pentru pagina 0 / 0 / offset.

Manipularea cuprinsul

În plus, la bază, deschide / închide / scriere / citire functiile descrise mai sus, programator, de asemenea, are o capacitate limitată de a manipula în mod direct sau să examineze datele în sine TOC.

int psio_tocprint (ULI unitate, FILE * outfile) : imprimă TOC a unităţii într-o formă uşor de citit la outfile, inclusiv cuvintele cheie de intrare şi de adrese globale de pornire / sfârşit. ( tocprint este, de asemenea, numele unei PSI3 modul de utilitate, care imprimă un fişier de cuprins la iesirea standard.)

int psio_toclen (ULI unitate, FILE * outfile) : Întoarce numărul de intrări în cuprins de unitate.

int psio_tocdel (ULI unitate, char * cheie) : Şterge intrarea cuprins corespunzătoare cheie. NB că această funcţie va şterge numai de referinţă de la intrarea de la cuprins în sine şi nu elimină datele corespunzătoare din fişierul. Prin urmare, este posibil să se introducă date "găuri" în fişierul.

int psio_tocclean (ULI unitate, char * cheie) : Şterge intrarea cuprins corespunzătoare cheie şi toate intrările ulterioare. Ca şi în cazul psio_tocdel (), această funcţie numai Sterge trimiterile de la intrarea cuprins în sine şi nu elimină datele corespunzătoare din fişierul. Această funcţie este încă în construcţie.

Utilizarea libpsio.a

Codul de mai jos ilustreaza utilizarea de bază a bibliotecii, cum şi atunci când / cum psio_init (), psio_ipv1_config (), şi psio_done () funcţii ar trebui să fie chemat în legătură cu initializare a libipv1.(Vezi sectiunea 3.1 mai târziu, în manualul pentru o descriere a elementelor de bază ale PSI3 programului.) <># Include <cstdio> # include <cstdlib> # include <libipv1/ip_lib.h> # include <libpsio/psio.h> # include <libciomr/libciomr.h> extern "C" { FILE * infile, * outfile; char * psi_file_fix; } folosind psi Spaţiu de nume:: MODULE_NAME; int main (int argc, char * argv []) { int i, M, N; dublu enuc, * some_data; psio_address următoare; / * specială pagina / * structura de compensare / psi_start (& infile, şi outfile, şi psi_file_fix, argc-1, argv +1, 0); ip_cwk_add (": MODULE_NAME"); / / MODULE_NAME în toate capacele tstart (outfile); / * Initializeaza I / O sistem * / psio_init () ; psio_ipv1_config (); / * Deschideţi fişierul şi a scrie o energie * / psio_open (31, PSIO_OPEN_NEW); enuc = 12.3456789; psio_write_entry (31, "Energie Repulsion nucleară", (char *) & enuc, sizeof (dublu)); psio_close (31,1); / * Citeşte rânduri M de o matrice de MXN dintr-un fişier * / some_data init_matrix = (M, N); psio_open (91, PSIO_OPEN_OLD); următoarele = PSIO_ZERO; / * Nota utilizare a macro speciale * / pentru (i = 0; i <M; i + +) psio_read (91, "Unele Coeficienţii", (char *) (some_data + i * N), N * sizeof (dublu), în continuare, şi următoarele); psio_close (91,0 ); / * Închideţi sistemul de I / O * / psio_done (); tstop (outfile); ip_done (); psi_stop (infile, outfile, psi_file_fix); exit (0); } extern "C" { char * gprgid () { char * prgid = "CODE_NAME"; retur (prgid); } }

Interfaţa la PSI3 I / O Sistemul a fost proiectat pentru a imita că din vechiul wreadw () şi wwritw () rutine de libciomr (a se vedea următoarea secţiune a acestui manual). Tabelul de sistem introduce un cuprins cateva complicatii care utilizatorii bibliotecii trebuie să fie conştienţi de:


Alte PSI3 C Biblioteci

Există mai multe biblioteci alte C PSI în afară anterior menţionate libipv1.a, libpsio.a, şi libciomr.a :
libchkpt.a Această bibliotecă oferă multe rutine pentru citirea de la şi scris la punctul de control''`` fişier, file32. Există, în general, o funcţie de diferite asociate cu fiecare cantitate în file32 (cum ar fi energia CSA, energia nucleară repulsie, geometrie, informaţii baza set, etc). Această bibliotecă utilizează libpsio.a bibliotecă să facă de intrare şi de ieşire sale. Acesta înlocuieşte o bibliotecă mai mari libfile30.a, care a servit în acelaşi scop, dar care au folosit vechiul I / O de la libciomr.a.
libiwl.a Noul format pentru stocarea de doi electroni integrale este IWL, sau integrale `` cu etichete''Biblioteca. libiwl.a oferă funcţii pentru citirea şi scrierea fişierelor în format IWL. Codul a fost scris cu scopul ca acesta ar putea fi uşor modificate pentru a permite funcţii de bază pentru mai mult de 256. Limită actual este 32768 funcţii baza.
libqt.a Aceasta este `` Quantum Trio''biblioteca, care conţine o serie de functii foarte experimentale sau funcţii care nu se potrivesc altfel altundeva.

În această secţiune vom lua în considerare aceste biblioteci mai în detaliu.


Checkpoint fişierul bibliotecă

Biblioteca Filosofie

Libchkpt.a Biblioteca este o colecţie de funcţii utilizate pentru accesarea PSI3 dosar punctul de control ( file32 ) - fişier care conţine toate informaţiile utilizate cel mai frecvent cu privire la calcul, cum ar fi geometria moleculară, set baza, factor determinant HF, etc Anterior, punctul de control Fişierul a fost un fisier in format fix, care este accesat utilizând vechiul PSI3 I / O de sistem. Cu toate acestea, acest lucru sa schimbat în primăvara anului 2002 pentru a utiliza noul libpsio.a I / O de sistem pentru a accesa fişierul punctul de control, şi este acum format liber. Aceasta este, orice programator poate adăuga conţinut la dosar la va. Vechea fişier Interfata punct de control a fost actualizat pentru a accesa noul sistem de suport I / O. Este obligatoriu ca fişierul de punctul de control este accesat prin intermediul libchkpt.a funcţiile numai.

Instrucţiuni de bază utilizare

În urma filosofia ca un programator care vrea să citească, să zicem, numărul de atomi şi etichetele irrep din dosar punctul de control nu ar trebui să utilizeze cincizeci de linii de cod pentru a face acest lucru, libchkpt.a a fost scris. În urma unui apel la o singură comandă, chkpt_init (), programator poate extrage biţi multe util al meciului de la dosar punctul de control relativ fără durere. libchkpt.a depinde de libipv1.a şilibpsio.a şi necesită prin urmare, că analizorul de intrare şi am / O, fiecare sistem, astfel încât să fie initializat etichetele corespunzătoare numele de fişier poate fi referit. Un exemplu de program minimal care stabileşte parser-ul de intrare, initilizes o structură specială în cadrul libchkpt.a bibliotecă, şi citeşte CSA HF de energie, eigenvector şi valorilor proprii este zentat mai jos. Pentru a ilustra capacitatea scris al rutinelor de bibliotecă, o energie marionetă corelate este scris la dosar punctul de control şi apoi citeşte înapoi din nou în cadrul codului. <># Include <cstdio> # include <cstdlib> # include <libipv1/ip_lib.h> # include <libciomr/libciomr.h> # include <libpsio/psio.h> # include <libchkpt/chkpt.h> extern "C" { FILE * infile, * outfile; char * psi_file_fix; } folosind psi Spaţiu de nume:: MODULE_NAME; int main (int argc, char * argv []) { int NMO; dublu escf, Etot; dublu * evals; dubla ** CSA; psi_start (& infile, şi outfile, şi psi_file_fix, argc-1, argv +1, 0); ip_cwk_add (": MODULE_NAME"); / / MODULE_NAME toate capace aici psio_init (); psio_ipv1_config (); / * pentru a începe cronometrarea, tstart (outfile ); * / /*------------------------------------ iniţializa acum structura de punctul de control şi începe să citească informatiile meciului ------------------------------------*/ chkpt_init (PSIO_OPEN_OLD); escf = chkpt_rd_escf (); evals = chkpt_rd_evals (); SCF = chkpt_rd_scf (); NMO = chkpt_rd_nmo (); chkpt_wt_etot (-1000.0); Etot = chkpt_rd_etot (); chkpt_close (); /*-------------- ------------------------------ imprima meciului pentru a vedea ceea ce a fost citit în ---------- ----------------------------------*/ fprintf (outfile, "\ n \ n \ tEscf = 20.10% Dacă \ n ", escf); fprintf (outfile, "\ tEtot =% 20.10lf \ n", Etot); fprintf (outfile, "CSA uitaţi să adăugaţi în secţiunea obligatorie gprgid ------------------------------------------- ------*/ extern "C" { char * gprgid () { char * prgid = ": MODULE_NAME"; retur (prgid); } }

Initializarea

chkpt_init int ()
initializeaza punctul de control struct, pentru a permite alte chkpt_ * funcţii pentru a-şi îndeplini sarcinile.

 

Argumente: libpsio markerul statutul PSIO_OPEN_OLD; impune de asemenea ca parser-ul de intrare să fie iniţializate, astfel încât să poată deschide fişierul punct de control.
Returnează: zero. Poate că acest lucru se va schimba într-o zi.

int chkpt_close ()
închide dosarul punctul de control, eliberează memorie, etc

 

Argumente: nici unul, dar chkpt_init trebuie să fi fost deja solicitat ca aceasta să funcţioneze.
Returnează: zero. Poate aceasta, de asemenea, se va schimba o zi.

Funcţii pentru informaţii lectură din dosar punctul de control

Această secţiune oferă o zentare generală a multora dintre funcţiile cele mai utilizate pe scară largă de la libchkpt.a. Pentru mai multe detalii şi descrieri de funcţii noi care nu sunt încă descrise aici, consultaţi doxygendocumentaţia generat la http://www.psicode.org/doc/libs/doxygen/html.
Funcţii care returnează char *
char * chkpt_rd_corr_lab ()
Citeşte într-o etichetă de la dosar punctul de control care descrie undă utilizată pentru a obţine energie corelate care sunt stocate în fişierul de punctul de control (a se vedea chkpt_rd_ecorr () ).

 

Argumente: nu ia argumente.
Returnează: un şir de caractere, cum ar fi "CISD", sau "MCSCF" sau un denumire alte undă.

char * chkpt_rd_label ()
Citeşte principalele eticheta fişier punctul de control.

 

Argumente: nu ia argumente.
Returnează: calcul etichetă.

char * chkpt_rd_sym_label ()
Citeşte eticheta pentru grupul de puncte.

 

Argumente: nu ia argumente.
Returnează: grup de puncte de etichetă.

Funcţii care returnează char **
char ** chkpt_rd_irr_labs ()
Citiţi în etichetele de simetrie pentru toate irreps în grupul punctul în care molecula este luată în considerare.

 

Argumente: nu ia argumente.
Returnează: o serie de etichete (siruri de caractere), care indica irreps pentru grupul de puncte, în care molecula este considerată, de _regardless_ dacă există orice orbite simetrie care transforma ca irrep.

char ** chkpt_rd_hfsym_labs ()
Citiţi în etichetele simetrie numai pentru acele irreps care au funcţii de bază.

 

Argumente: nu ia argumente.
Returnează: o serie de etichete (siruri de caractere), care indica irreps care au funcţii de bază (în bumbac comanda). Pentru apa DZ sau STO-3G, de exemplu, în $ C_ {\ rm 2v} $simetrie, aceasta ar fi o serie de trei etichete: "A1", "B1", şi "B2".

Funcţii care returnează int
int chkpt_rd_iopen ()
Citeşte în dimensionalităţii (până la un semn) şi vectori de ALPHA BETA a doi electroni coeficienţi de cuplare pentru scoici deschise (a se vedea chkpt_rd_ccvecs () ). Notă: iopen = MM * (MM + 1), în cazul în care MM este numărul total de irreps care conţin orbitali individual ocupate.

 

Argumente: nu ia argumente.
Returnează: + / - dimensionalitatea ALPHA şi a vectorilor BETA a coeficienţilor de cuplare pentru scoici deschise.

chkpt_rd_max_am int ()
Citeşte în numărul maxim cuantic orbital de AOS în baza.

 

Argumente: nu ia argumente.
Returnează: maxim de numărul cuantic orbital de AOS în baza.

int chkpt_rd_mxcoef ()
Citeşte valoarea constantei mxcoef.

 

Argumente: nu ia argumente.
Returnează: suma pătratelor a numărului de orbite simetrie pentru fiecare irrep. Acest lucru dă numărul de elemente din blocuri de simetrie non-zero SCF eigenvector. Pentru STO-3G apă mxcoef$ = (4 * 4) + (0 * 0) + (1 * 1) + (2 * 2) = 21 $.

int chkpt_rd_nao ()
Citeşte în numărul total de orbite atomice (a se citi: funcţii carteziană Gaussian).

 

Argumente: nu ia argumente.
Returnează: numărul total de orbitali atomice.

chkpt_rd_natom int ()
Citeşte în numărul total de atomi.

 

Argumente: nu ia argumente.
Returnează: numărul total de atomi.

chkpt_rd_ncalcs int ()
Citeşte în numărul total al calculelor în dosarul checkpoint (a fost întotdeauna 1 din vechea libfile30.a, probabil încă mai este pentru moment).

 

Argumente: nu ia argumente.
Returnează: numărul total de calcule în fişierul punctul de control.

chkpt_rd_nirreps int ()
Citeşte în numărul total de rezentări ireductibile în grupul punctul în care molecula este luată în considerare.

 

Argumente: nu ia argumente.
Returnează: numărul total de rezentări ireductibile.

int chkpt_rd_nmo ()
Citeşte în numărul total de orbite moleculare (poate fi diferit de numărul de funcţii de bază).

 

Argumente: nu ia argumente.
Returnează: numărul total de orbitali moleculare.

chkpt_rd_nprim int ()
Citeşte în numărul total de funcţii primitive gaussiene (primitivele numai de atomi de independent_ _symmetry sunt numărate!).

 

Argumente: nu ia argumente.
Returnează: numărul total de funcţii primitive Gaussian.

chkpt_rd_nshell int ()
Citeşte în numărul total de scoici. De exemplu, baza DZP stabilite pentru atom de carbon (schema de contractie ) are un total de funcţii de bază 15, 15 primitive, şi 7 scoici. Cochilii de atomi de _all_ sunt numărate (nu numai din simetrie independente; compara chkpt_rd_nprim ). $ [9s5p1d/4s2p1d] $

 

Argumente: nu ia argumente.
Returnează: numărul total de scoici.

int chkpt_rd_nso ()
Citeşte în numărul total de simetrie-adaptată funcţii bază (a se citi: Gaussians carteziene sau sferice armonice).

 

Argumente: nu ia argumente.
Returnează: numărul total de SOS.

int chkpt_rd_nsymhf ()
Citeşte în numărul total de irreps în grupul punctul în care molecula este luată în considerare, care au non-zero, numărul de funcţii de bază. Pentru STO-3G sau apă DZ, de exemplu, aceasta este de trei, chiar dacă nirrepseste 4 (a se compara chkpt_rd_nirreps int () ).

 

Argumente: nu ia argumente.
Returnează: numărul total de rezentări ireductibile cu un număr de non-zero, a funcţiilor de bază.

chkpt_rd_num_unique_atom int ()
Citeşte în numărul de atomi de simetrie unic.

 

Argumente: nu ia argumente.
Returnează: număr de atomi de simetrie unic.

chkpt_rd_num_unique_shell int ()
Citeşte în numărul de scoici simetrie unic.

 

Argumente: nu ia argumente.
Returnează: numarul de cartuse simetrie unic.

chkpt_rd_phase_check int ()
Citeşte faza de pavilion, care este 1 în cazul în care fazele orbitale au fost verificate şi este 0 în caz contrar (doar faza de verificare ajută la asigurarea fazele arbitrară a orbite sunt consecvente de la o geometrie la alta, care ajută la ghicitul diferite sau extrapolarea scheme).

 

Argumente: nu ia argumente.
Returnează: pavilion.

int chkpt_rd_ref ()
Citeşte tipul de referinţă de pavilion în fişierul punctul de control. 0 = RHF, 1 = UHF, 2 = ROHF, 3 = TCSCF.

 

Argumente: nu ia argumente.
Returnează: pavilion indicând de referinţă.

int chkpt_rd_rottype ()
Citeşte tipul de rotor rigid molecula rezintă. 0 = asimetric, 1 = simetrice, 2 = sferice, 3 = liniare, 6 = atom.

 

Argumente: nu ia argumente.
Returnează: rotor de tip rigid.

Funcţii care returnează * int
int chkpt_rd_am2canon_shell_order * ()
Citeşte în matrice de cartografiere din angmom-a ordonat să canonice (în ordinea apariţiei) Lista de cochilii.

 

Argumente: nu ia argumente.
Returnează: o matrice nshell lung, care coji de hărţi de pe angmom-a ordonat să canonice (în ordinea apariţiei) ordine.

chkpt_rd_atom_position ()
Citeşte în poziţiile de atomi de simetrie. Valorile permise sunt după cum urmează:

Aceste date sunt suficiente pentru a defini stabilizatorilor de nuclee.

 

Argumente: nu ia argumente.
Returnează: o serie de posturi de atomi de simetrie.

int * chkpt_rd_clsdpi ()
Citeşte într-o matrice care are un element pentru fiecare irrep din grupul de puncte de a moleculei (nb nu doar pe cele cu un număr de non-zero, a funcţiilor de bază). Fiecare element conţine numărul de dublu ocupate MOS pentru că irrep.

 

Argumente: nu ia argumente.
Returnează: numărul de MOS de două ori pe irrep ocupate.

int * chkpt_rd_openpi ()
Citeşte într-o matrice care are un element pentru fiecare irrep din grupul de puncte de a moleculei (nb nu doar pe cele cu un număr de non-zero, a funcţiilor de bază). Fiecare element conţine numărul de MOS individual ocupate pentru că irrep.

 

Argumente: nu ia argumente.
Returnează: numărul de MOS individual ocupate pe irrep.

int * chkpt_rd_orbspi ()
Citeşte în numărul de MOS în fiecare irrep.

 

Argumente: nu ia argumente.
Returnează: numărul de MOS în fiecare irrep.

int * chkpt_rd_shells_per_am ()
Citeşte în numărul de scoici în fiecare bloc angmom.

 

Argumente: nu ia argumente.
Returnează: numărul de scoici în fiecare bloc angmom.

chkpt_rd_sloc ()
Citeşte într-o matrice de pointeri la AO primul din fiecare coajă.

 

Argumente: nu ia argumente.
Returnează: Citeşte într-o serie nshell lung de pointeri la AO primul din fiecare coajă.

chkpt_rd_sloc_new ()
Citeşte într-o matrice de pointeri la funcţia de baza prima (nu ca AO chkpt_rd_sloc nu) de la fiecare coajă.

 

Argumente: nu ia argumente.
Returnează: o serie nshell lungă de pointeri la funcţia de bază de la prima fiecare coajă.

int * chkpt_rd_snuc ()
Citeşte într-o matrice de indicatori către nucleele pe care cochilii sunt centrate.

 

Argumente: nu ia argumente.
Returnează: o serie nshell lungă de indicatori către nucleele pe care cochilii sunt centrate.

int chkpt_rd_snumg * ()
Citeşte în matrice de numere de Gaussians primitive în scoici.

 

Argumente: nu ia argumente.
Returnează: o serie nshell lung a numărului de Gaussians primitive în cochilii.

int chkpt_rd_sprim * ()
Citeşte în pointeri la primul primitive din fiecare coajă.

 

Argumente: nu ia argumente.
Returnează: o serie nshell lung de pointeri la primul primitive din fiecare scoici.

chkpt_rd_sopi ()
Citiţi în numărul de simetrie-adaptată funcţiilor de bază în fiecare bloc simetrie.

 

Argumente: nu ia argumente.
Returnează: o serie nirreps lung a numărului de orbite simetrie în blocuri de simetrie.

int * chkpt_rd_stype ()
Citeşte în număr de moment cinetic de scoici.

 

Argumente: nu ia argumente.
Returnează: Returnează un tablou nshell lungă de numere momentului cinetic de scoici.

int * chkpt_rd_symoper ()
Citiţi în matrice de cartografiere între "canonice", prin care se dispune operaţiunilor simetrie al grupului punct, iar cel definit în symmetry.h.

 

Argumente: nu ia argumente.
Returnează: o matrice de cartografiere nirrep lung

int * chkpt_rd_ua2a ()
Citiţi în matrice de cartografiere de la simetria-unic listă atom la atom lista completă.

 

Argumente: nu ia argumente.
Returnează: o matrice de cartografiere num_unique_atom lung

int * chkpt_rd_us2s ()
Citiţi în matrice de cartografiere din lista de shell-simetria unic la lista de coajă completă.

 

Argumente: nu ia argumente.
Returnează: o matrice de cartografiere num_unique_shell lung

Funcţii care returnează int **
chkpt_rd_ict int ** ()
Citeşte proprietăţile de transformare a nucleelor în cadrul operaţiunilor de permis pentru un grup special punctul de simetrie, în care molecula este luată în considerare.

 

Argumente: nu ia argumente.
Returnează: o matrice de numere întregi. Fiecare rând corespunde la o operaţiune de simetrie special, în timp ce fiecare coloană corespunde unui anumit atom. Valoarea de TIC [2] [1], atunci, ar trebui să fie intertată în felul următor: în aplicare a operaţiunii simetrie al treilea grup de puncte de relavant, al doilea atom este plasat în locul iniţial ocupate de numărul de atom TIC [2 ] [1].

chkpt_rd_shell_transm int ** ()
Citeşte în matricea de transformare pentru scoici. Fiecare rând al matricei este orbita de coajă în cadrul operaţiunilor de simetrie al grupului punct.

 

Argumente: nu ia argumente.
Returnează: o matrice de nshell * nirreps numere întregi.

Funcţii care returnează dublu
dublu chkpt_rd_ecorr ()
Citeşte în corelaţie de energie stocată în fişierul punctul de control. Pentru a obţine câteva informaţii (o etichetă) cu privire la tipul de undă corelate folosite pentru a obţine această energie, a se vedea chkpt_rd_corr_lab ().

 

Argumente: nu ia argumente.
Returnează: corelaţie de energie.

dublu chkpt_rd_enuc ()
Citeşte în energia nucleară repulsia

 

Argumente: nu ia argumente.
Returnează: centrala nucleară de la repulsia de energie.

chkpt_rd_eref dublu ()
Citeşte în energie de referinţă (poate fi diferit de energie HF).

 

Argumente: nu ia argumente.
Returnează: de referinţă de energie.

dublu chkpt_rd_escf ()
Citeşte în HF SCF de energie.

 

Argumente: nu ia argumente.
Returnează: CSA a HF de energie.

dublu chkpt_rd_etot ()
energia totală, fie că este vorba HF, CISD, CCSD, sau orice altceva! Aceasta este funcţia de ferat să o utilizaţi pentru optimizarea geometriei prin energii, energii de imprimare în analiză, etc, deoarece această valoare este valabilă indiferent de tipul de calcul.

 

Argumente: nu ia argumente.
Returnează: Total de energie.

Funcţii care returnează * dublu
* dublu chkpt_rd_evals ()
dublu * chkpt_rd_alpha_evals ()
dublu * chkpt_rd_beta_evals ()
Citeşte în (spin-restricted HF, $ \ Alpha $UHF, şi $ \ Beta $valorilor proprii UHF): energiile orbital.

 

Argumente: să ia nici un argument.
Returnează: o serie de _all_ de valori proprii CSA, ordonate după irrep, şi prin creşterea de energie în cadrul fiecărui irrep. (De exemplu, pentru STO-3G de apă, cele patru $ $ A_1toate valorile proprii sunt pe primul loc, iar cei patru sunt ordonate de la cel mai mic de energie la cea mai mare energie, urmat de o singură $ $ B_1valoare proprie, etc - Pitzer de comandă)

* dublu chkpt_rd_exps ()
Citeşte în exponenţi ai funcţiilor primitive Gaussian.

 

Argumente: nu ia argumente.
Returnează: o serie de camere duble.

dublu chkpt_rd_zvals * ()
Citeşte în taxe nucleare.

 

Argumente: nu ia argumente.
Returnează: o matrice natom lungi de taxe nucleare (ca dublu).

Funcţii care returnează ** dublu
dublă ** chkpt_rd_blk_scf (int irrep)
dublu ** chkpt_rd_alpha_blk_scf (int irrep)
dublu ** chkpt_rd_beta_blk_scf (int irrep)
Citeşte într-un bloc simetrie al (RHF, $ \ Alpha $UHF, $ \ Beta $eigenvector UHF).

 

Argumente: int irrep, desemnează bloc simetrie dorit
Returnează: o matrice pătrată a orbspi [irrep] rânduri. Vectorilor proprii sunt stocate cu indicele de coloana care indică MOS şi indicele de rând care denotă SOS: acest lucru înseamnă că scf_vector [i] [j]este contribuţia $ I $-lea CO la $ J $OM-lea.

dublă ** chkpt_rd_ccvecs ()
Citeşte într-o matrice de rânduri care sunt ALPHA (ccvecs [0]) şi BETA (ccvecs [1]), matrici de coeficienţi de cuplare pentru scoici deschise stocate în forma triunghiulara mai mici. Coeficienţii de cuplare sunt definite NU ca în CCJRoothaan Mod Rev. Phys. 32, 179 (1960), astfel cum este menţionată în paginile manualului pentru CSCF, dar în conformitate cu Pitzer (nr de referinţă încă), şi sunt diferite ** ** de cele din Yamaguchi, Osamura, Goddard, si rezervati in Schaefer lui "derivate analitice. Metode în Initio Teoria Ab moleculară structură electronică "
Raportul dintre lui Pitzer şi convenţiilor Yamaguchi este, după cum urmează: ALPHA = 1-2 * o, BETA = 1 +4 * b, unde a şi b sunt alfa şi a lui beta pentru scoici deschise definite la pp. 69-70 de carte doctorului lui Yamaguchi.

 

Argumente: nu ia argumente.
Returnează: duble ** ccvecs, într-o matrice 2 de abs (iopen) rânduri de care sunt de cuplare matrice coeficient pentru open-scoici în formă ambalate. Pentru definiţia iopen vedea chkpt_rd_iopen ().

chkpt_rd_contr_full ()
Citeşte în coeficienţii de contracţie normalizat.

 

Argumente: nu ia argumente.
Returnează: într-o matrice MAXANGMOM de numărul total de primitive (o constantă definită în???) nprim ; fiecare Gaussian primitive contribuie la numai o coajă (şi o funcţie baza, desigur), astfel încât cele mai multe dintre aceste valori sunt zero.

dublă ** chkpt_rd_geom ()
Citeşte în geometria carteziană.

 

Argumente: nu ia argumente.
Returnează: Geometria carteziană este returnat ca o matrice de dublu. Indicele rând este indicele atomică, iar coloana de direcţie este indicele cartezian (x = 0, y = 1, z = 2). Prin urmare, Geom [2] [0] ar fi x-coordonata treilea atom.

chkpt_rd_lagr ()
chkpt_rd_alpha_lagr ()
chkpt_rd_beta_lagr ()
Citeşte într-un (RHF, $ \ Alpha $UHF, $ \ Beta $UHF) Lagrangiana matricea în baza MO.

 

Argumente: nu ia argumente.
Returnează: într-o matrice NMO de NMO.

dublă ** chkpt_rd_scf ()
dublu ** chkpt_rd_alpha_scf ()
dublu ** chkpt_rd_beta_scf ()
Citeşte în (RHF, $ \ Alpha $UHF, $ \ Beta $eigenvector UHF).

 

Argumente: nu ia argumente.
Returnează: o matrice pătrată cu dimensiunile de NMO de NMO (a se vedea: chkpt_rd_nmo () ). Blocurile de simetrie al vectorului SCF apar pe diagonala de această matrice.

chkpt_rd_schwartz ()
Citeşte în tabelul de maximele din Schwartz integrale (ij | ij) pentru fiecare dublet coajă.

 

Argumente: nu ia argumente.
Returnează: NULL dacă nu tabel este zentă în fişierul punctul de control, într-o matrice nshell de nshell altfel.

chkpt_rd_usotao_new ()
Citeşte într-o matrice de transformare a AO CO.

 

Argumente: nu ia argumente.
Returnează: o NSO prin ONC matrice de camere duble.

chkpt_rd_usotbf ()
Citeşte într-o funcţie de bază a matricei de transformare CO.

 

Argumente: nu ia argumente.
Returnează: o NSO de NSO matrice de camere duble.

Funcţii care returnează struct * z_entry
Z-matrice este citit de la punctul de control fişier ca o matrice de z_entry struct care sunt declarate în chkpt.h. Această structură conţine atomul de referinţă, un steag de optimizare, valoarea coordonează, cum şi orice etichetă utilizat pentru fiecare coordonate interne. Atunci când nu se aplică (cum ar fi primele câteva rânduri de la A la Z-matrice) atom variabile sunt date valorile de -1, opt variabile sunt date valorile de -1, valvariabilele sunt date valorile de -999.9, şi eticheta siruri de caractere sunt lăsate goale.

chkpt_rd_zmat ()
Citeşte în z-matrice

 

Argumente: nu ia argumente.
Returnează: struct * z_entry natom lung.


Biblioteca Integrale-Cu-Etichete

Biblioteca libiwl.a conţine funcţii pentru citirea şi scrierea pentru fişierele cu "Integrale cu etichete" (IWL), format creat de David Sherrill în 1994, modelat după formatul de fişier vechi integralele de la PSI2. Majoritatea funcţiilor face cu patru-indicele quantitites, dar există şi câteva care se ocupă cu două-indice cantităţile cum ar fi un electron-integralele. Formatul IWL specifică faptul că cantităţile 4-index sunt stocate pe disc în mai multe tampoane; fiecare buffer are un segment antet care oferă unele informaţii utile. În zent, header-ul este amenajat după cum urmează: un cuvânt întreg este folosit ca un steag, spune dacă bufferul curent este ultimul tampon în fişierul. Întreg următor dă numărul de integrale (şi etichete asociate acestora), în zona-tampon actuale. După această informaţie antet, fiecare tampon conţine două segmente de date: una pentru etichete, şi unul pentru valorile integralele asociate. Datasize pentru etichetelor este definită utilizând typedefs, astfel încât este uşor să se schimbe (în zent, acesta este un int scurt); de asemenea, pentru valorile integrală (în zent, de tip dublu).Durata acestor segmente de date este NBUF * 4 * sizeof (Label) şi NBUF * sizeof (Value), respectiv. Utilizarea actuală a ints scurt pentru Label este într-adevăr oarecum excesivă, făcând fişierele ceva mai mare decât este strict necesar. Cu toate acestea, astfel se evită încurcată bit-ambalare scheme, şi instantaneu ne permite să aibă până la ceva de genul funcţii de bază 65536 adresabile.

Funcţiile anterior documentate în acest manual au fost eliminate pentru că documentaţia este acum de actualitate. Documentare al bibliotecii este acum create direct din codul sursă folosind doxygen program şi este disponibil la http://www.psicode.org/doc/libs/doxygen/html.


`` Quantum Trio''Biblioteca

Libqt.a Biblioteca este o colecţie de diverse matematica utile şi alte rutine. Documentaţia găsită anterior în acest manual de libqt.a funcţii a fost eliminat, iar acum este învechit. Documentaţia actuală a acestei biblioteci este generat automat de doxygen programului şi este disponibil pe site-ul de la http://www.psicode.org/doc/libs/doxygen/html.


Stil de programare

În contextul de programare, stil se poate referi la multe lucruri. În primul rând, se referă la formatul de cod sursa: cum să folosiţi indentarea, atunci când a adăuga comentarii, cum se nume variabile, etc se poate referi, de asemenea, la multe alte probleme, organizarea astfel de cod, modularitate, şi eficienţa. Desigur, se referă la stilistice sunt frecvent probleme individuale de gust, dar de multe ori valabilitatea şi portabilitate a codului va depinde în ultimă instanţă asupra deciziilor stilistice făcute în procesul de dezvoltare a codului. De aceea unele alegeri stilistice sunt privite ca universal rau (de exemplu, nu de prototipuri orice funcţie doar pentru că `` codul compileaza si ruleaza fin ca este'', etc.) Desigur, este uşor să nu aibă nici un stil, dar este nevoie de ani pentru a afla ceea ce face unul bun. Un stil de programare bun poate reduce timpul de depanare şi întreţinere dramatic.Pentru un pachet mare, cum ar fi PSI3, este foarte important să se adopte un stil care face codul de uşor de înţeles şi de modificarea de către alţii. Această secţiune va oferi câteva indicii pe scurt ceea ce noi considerăm a fi un stil bun în programare.

La procesul de scriere a software-ului

La început, ne simţim necesar să se atingă, la problema de stil de programare văzute la modul de abordare a scris software-ul. Adesea, `` programare''este folosit pentru a înţelege `` procesul de scriere a software-ului''.În general, trebuie sa distingem `` software-ul scris de programare de la''`` sensul cuvântului''`` punerea în aplicare'', pentru că acesta din urmă este doar o parte din fosta si nu include documentare, etc În general, software-ul scris `` ''ar trebui să constea din cinci părţi:
  1. Obţineţi o înţelegere clară şi detaliată a ceea ce cod are de a face (idee);
  2. Identificarea concepte cheie şi codul de aspect şi de organizare a datelor (de proiectare);
  3. Scrie codul sursă (punere în aplicare);
  4. De testare a programului şi a elimina erorile şi / sau defecte de proiectare (de testare);
  5. Scrierea documentaţiei (documentare).
Astfel, software-ul scris este cu mult mai complex decât doar de codificare. Fiecare etapă a software-ului de scriere este la fel de important ca şi ceilalţi şi nu ar trebui să fie considerată o pierdere de timp. Codul de scris, fără o înţelegere detaliată a ceea ce are de a face să nu funcţioneze corect. Codul de prost conceput nu poate fi suficient de flexibilă pentru a se adapta unor caracteristici noi şi vor fi rescrise. Codul de slab puse în aplicare ar putea fi a lent pentru a fi util. Un document complet de valori incorecte produsă de codul dumneavoastră poate să te concediat si va distruge reputaţia dumneavoastră. O documentatie fara codul va fi cel mai probabil inutil pentru alţii.

Desigur, pentru design foarte simplu de programe şi punerea în aplicare pot fi combinate şi documentaţia poate consta din o linie. Cu toate acestea, pentru programe mai complexe, se recomandă ca cele cinci etape sunt urmate. Acest lucru înseamnă că ar trebui să petreacă doar aproximativ 20-40% din codul sursă scris de timp! Experienţa noastră ne arată că, în urma acestui rezultat sistem în abordarea cea mai eficientă de programare pe termen lung.

Pentru a afla mai multe des fiecare etapă a procesului de scriere software-ul, poate doriţi să se refere la lui Stroustrup `` C + + Programming Language''carte (a 3-nn.) Ca sursă de referinţă cele mai comune, nu dedicat exclusiv pentru un singur subiect înguste. Pe langa faptul ca o descriere excelenta a C + +, acesta este, de asemenea, o introducere a scris software-ul, de asemenea. O atenţie deosebită este acordată la problemaprogramului de proiectare.

Probleme de proiectare

Deşi C nu are cele mai puternice caracteristici ale C + + în ceea ce priveşte conceptele şi organizarea de date este în cauză, Stroustrup spune: `` Amintiţi-vă că programarea de mult poate fi pur şi simplu şi clar face folosind doar primitive, structuri de date, funcţii de simplu, şi câteva clase bibliotecă. ''Acest lucru înseamnă că se poate scrie mai multe utile şi bine scris programe în C. Iată câteva indicii care vă vor ajuta în structurarea program C: Mai mult material cu privire la organizarea de date pot fi găsite în cartea lui Stroustrup.


Organizarea codului sursă

Este aproape universal de acord că ruperea programul până în mai multe fişiere este stilul bun. Un 11,592 linie de program Fortran, de exemplu, este foarte incomod de a lucra cu, din mai multe motive: în primul rând, poate fi dificil pentru a localiza o anumita functie 1 sau o declaraţie în al doilea rând, fiecare recompilare in timpul depanarii implică întocmirea întregului dosar. Având în mai multe fişiere mici, în general, face mai uşoară, să găsească o bucată de cod, şi numai fişierele sursă care au fost modificate trebuie să fie recompilate, sporind considerabil eficienţa de programator în timpul procesului de depanare. În cazul programelor mai mici, se recomandă ca programator au un fişier pentru fiecare subrutină, oferindu fiecare fişier numele subrutina (abreviat numele de fişiere pot fi specificate în cazul în care numele de functii sunt a lungi). Pentru programe mai mari, ar putea fi util pentru a grupa cu funcţii similare, îmună într-un singur fişier.

În programele C, considerăm, de asemenea, o idee bună pentru a plasa toate # include declaraţiile într-un fişier, cum ar fi includes.h, care este ulterior inclus în fiecare fişier sursă C relevante. Acest lucru este util, deoarece dacă un fişier antet nou trebuie sa fie adaugata, acesta poate fi pur şi simplu adăugate la includes.h. În plus, dacă un fişier sursă dintr-o dată trebuie să aibă acces la o variabilă globală sau prototip functie, care este deja zent într-unul dintre fişierele antet, atunci nici o schimbare trebuie să fie efectuate; fişierul header este deja inclusă. Un dezavantaj la această abordare este că fiecare fişier header este inclus în fiecare fişier sursă, care include includes.h, indiferent dacă un fişier header special, este, de fapt nevoie de faptul că fişierul sursă; acest lucru ar putea conduce la mai compila ori, dar ea nu e " probabil pentru a face o diferenţă sesizabilă, cel puţin în C. t 2

În mod similar, este util să se definească toate variabilele globale într-o singură locaţie (în fişierul programul principal, sau altceva în cadrul globals.c ), iar acestea ar trebui să fie declarat în termen de o altă locaţie standard (probabil globals.h, sau common.h ). 3 În mod similar, în cazul în care funcţiile sunt utilizate în mai multe fişiere diferite codul sursă, programator poate dorinţa de a plasa toate declaraţiile prototip funcţia într-un fişier antet singur, cu acelaşi nume ca programul sau de bibliotecă, sau, poate, numit protos.h.

Formatarea din Codul

Prin formatare, ne referim la cât de multe spaţii pentru a liniuţă, atunci când la liniuţă, modul în care să se potrivească la bretele, când se utilizează de capital in Raport cu litere mici, şi aşa mai departe. Aceasta este probabil o chestiune mai subiectivă decât cele discutate anterior. Cu toate acestea, este cu siguranţă adevărat că anumite stiluri de formatare sunt mai uşor de citit decât altele. Pentru cod deja existente, vă recomandăm să vă sunt conforme cu convenţia de formatare deja zente în codul. Autorul a codului este de natură să se supără atunci când vede că eşti încorporate fragmente de cod cu un stil de formatare care diferă de la lui! Pe de altă parte, în anumite cazuri rare, ar putea fi mult mai benefic să includă un stil diferit: în conversia de intder95 de stil vechi la nou-stil de intrare, am folosit mici caz Inscripţia de pe locul al stilului toate capacele de programul original.Acest lucru a fost foarte utilă în a ne ajuta localiza pe care Schimbările pe care le făcuse.

Este foarte frecvente situaţiile în care buclele sunt indentate. Buclele în cadrul buclele sunt indentate încă o dată, şi aşa mai departe. Această practică este aproape universal şi de foarte mare ajutor. Programe de chimie computaţională necesită adesea mai multe bucle imbricate. Consecinţa acestui fapt este că liniile pot fi destul de lunga, ca urmare a tuturor celor spaţiile înainte de fiecare linie în bucle cel mai intim. În cazul în care liniile devin mai mult de 80 de caractere, ele sunt greu de citit într-o singură fereastră, vă rugăm să încercaţi să păstraţi liniile de la 80 de caractere sau mai puţin. Acest lucru înseamnă că ar trebui să utilizaţi aproximativ 2-4 locuri de pe nivelul de indentare.

De potrivire de bretele, şi aşa mai departe, este mai mult variabil, şi vă recomandăm să urmaţi convenţia a limbajului de programare C, prin Kernighan si Ritchie, sau poate stilul găsite în alte PSI3 module.

Numirea de variabile

Toate datele non-trivial trebuie să se acorde nume descriptive, deşi nume extrem de lungi sunt descurajate. De exemplu, nume de variabile cum ar fi compus num_atoms sau atom_orbit_degen ar trebui să fie feratănat sau atord, astfel încât non-specialişti ar putea intelege cod. De asemenea, este o idee bună de a pune un comentariu descriptiv în cazul în care o variabilă non-trivial este declarat. Cu toate acestea, indicii simplu bucla ar trebui să fie, în general, numit i, j, k sau P, Q, R.

PSI3 programe au anumite convenţii în loc de nume de cele mai multe variabile comune, după cum se arată în tabelul 1.


Tabelul 1: Unele convenţiile Variabila Naming în PSI3
Cantitate Variabila (e)
Număr de atomi de na, natom, num_atoms
Numărul de atomi * 3 natom3, num_atoms3
Repulsie nucleară de energie enuc, repnuc
SCF de energie escf
Numărul de orbite atomice nbfao, num_ao, NAO
Numărul de orbite simetrie nbfso, num_so, NSO
Dimensiunea triunghiului inferior
al lui AO, SO lui nbatri, nbstri; ntri
Fişierul de intrare indicatorul infile
Fişier de ieşire indicatorul outfile
Offset matrice ioff
Numărul de irreps num_ir, nirreps
Open-coajă de pavilion iopen
Numărul de orbite pe irrep orbs_per_irrep, orbspi, mopi
Numărul de închis-cochilii
pe irrep DOCC, clsd_per_irrep, clsdpi
Numărul de open-cochilii
pe irrep socc, open_per_irrep, openpi
Orbital simetrie matrice orbsym

Imprimarea convenţiile

În momentul de faţă, nu există cu adevărat o metodă standard pentru un program de PSI pentru a determina cât de multă informaţie pentru a imprima la output.dat. Unele mai mari PSI3 module citit un pavilion numit de obicei iPrint, care este o rezentare zecimală a unui număr binar. Fiecare bit este o opţiune de imprimare (da sau nu) pentru intermediari diferite special pentru acest program.

O practică care este, probabil, de ferat este de a avea un semnalizator de imprimare diferit (boolean) pentru fiecare dintre intermediarii majore folosite de un program, şi de a avea o opţiune de imprimare globală (zecimal), a căror valoare determină cantitatea de informatii afisate de imprimare pentru cantităţile specifice de imprimare fără o opţiune. Opţiunea de imprimare globală ar trebui să fie specificate de un cuvânt cheiePRINT_LVL, şi acţiunea sa ar trebui să fie ca în tabelul 2.


Tabelul 2: Nivelul de convenţiile propuse pentru imprimare
0 Aproape nici de imprimare; care urmează să fie utilizate de către programe de conducător auto
cu-liniştită opţiune
1 Imprimare obişnuită (implicit)
2 Verbose tipărire
3 Unele informaţii de depanare
4 Substanţiale informaţii de depanare
5 Tipăreşte aproape toate produsele intermediare cu excepţia cazului în matrice a mare
6 Print totul


Comentând Codul Sursa

Este absolut obligatoriu ca fiecare fişier sursă conţine un număr rezonabil de comentarii. Atunci când o variabilă importantă, tipul de date, sau o funcţie este declarată, ea trebuie să fie însoţită de unele informaţii descriptive scrise în limba engleză. Fiecare prototip funcţie sau organismul de aceasta trebuie să fie cedată de o scurtă descriere a scopului său, algoritmul (de dorit, în cazul în care este a complex, furnizează o referinţă), ce argumente este nevoie şi pentru ce se întoarce.

Acestea fiind spuse, vom argumenta împotriva comentarea excesive: nu a adauga un comentariu de fiecare data cand faceti i + + ! Acesta va face de fapt codul mai greu de citit. Fii sensibil.

Ca din primăvara anului 2002, am adoptat doxygen programului pentru a genera automat codul sursă documentare. Acest program scaneaza codul sursa si cauta coduri speciale care se spune pentru a adăuga blocul în comentariu dat la lista de documente. Programul este foarte fancy si poate genera documentaţie în om, html, latex, şi formate rtf. Fişierul psi3.dox este doxygen fişierul de configurare. Codul sursă ar trebui să fie comentat în felul următor pentru a lucra cu doxygen.

Pe primul fişier de fiecare bibliotecă defineşte un modul ``''printr-o linie de comentariu de construcţii:

<>/ *! \ Defgroup PSIO libpsio: PSI I / O Biblioteca * / Notă semn de exclamare de mai sus - este necesar de doxygen. Linia de mai sus defineste PSIO cheie si asociatii cu titlul `` PSI I / O Biblioteca''Fiecare fişier din această grupă va avea un comentariu deosebit de formularul de mai jos.: <>/ *! ** \ fişier ** \ ingroup PSIO ** \ O scurtă descriptor scurtă a fişierului ar trebui să meargă aici ** ** O descriere mai detaliată a dosarului poate merge aici * / Acest lucru spune doxygen ca si acest fisier ar trebui să fie documentate, ar trebui să fie adăugat la lista de fişiere documentate, şi face parte din PSIO grup. A nu se pune numele fişierului real după fişierul directivă, deoarece versiunile actuale de doxygen au probleme atunci când apar nume de fişiere duplicat în module diferite. Necompletarea filename după fişierul directivă permite doxygen a crea un nume de fişier unic utilizând o parte din calea de fişier.

Toate funcţiile trebuie să fie comentat ca în următorul text:

<>/ *! ** PSIO_CLOSE ():. închide un fişier PSI acces direct multi- ** ** \ unitate param = unitate de numărul PSI utilizate pentru a identifica fişierul pe toate citească. ** şi a scrie funcţiile ** \ param păstra = booleene pentru a indica dacă fişierul ar trebui să fie eliminat (0) sau ** reţinute (1). ** ** Întoarce: returnează întotdeauna 0 ** ** \ ingroup PSIO * / int psio_close (ULI unitate, int păstreze)... Aceasta va adăuga funcţia psio_close la lista, se asociază cu PSIO modulul, şi să definească diferite argumente.

Vă rugăm să reţineţi: În plus faţă de lista cu toţi parametrii şi valorile returnate, este foarte valoros pentru a explica ceea ce funcţia de fapt, nu. Adaugă această explicaţie imediat după numele funcţiei (a se vedea mai sus).Această explicaţie ar putea fi câteva cuvinte, sau un întreg paragraf, după cum este necesar.

Este posibil să includă formule în documentaţia doxygen şi pentru a le în mod corespunzător atunci când formatat de ieşire pentru a HTML sau LaTeX. În cazul în care formula apare în textul de funcţionare a unui comentariu doxygen, încadraţi în termen de o pereche de $ \ Backslash $f $ comenzi, şi formataţi-l în conformitate cu normele LaTeX. Pentru a face formula centrată pe o linie nouă, încadraţi în cadrul $ \ Backslash $f [ şi $ \ Backslash $f]. În cazul în care formula este să fie într-un alt mediu decât modul matematice simple (de exemplu, un eqnarray, apoi începe cu mediul $ \ Backslash $f} {mediului şi se încheie cu $ \ Backslash $f}, în cazul în care mediul este ceva de genul * eqnarray. Conform documentaţiei doxygen, programul poate avea probleme de recuperare de la tastare în formlas, şi pentru a scăpa de o greşeală de scriere într-o formulă poate fi necesară pentru a elimina fişierul formula.repository din directorul HTML.


Makefiles în PSI3

Face de utilitate este proiectat pentru a ajuta la mentinerea multe componente ale unui program de mare, cum ar fi PSI. Această secţiune va descrie construcţia şi utilitatea Makefiles în PSI, atât în codul de dezvoltare şi în producţie la nivel de module. Vom fi în cauză numai cu Proiectul GNU a face instalaţia, şi nu mai vechi, versiuni mai puţin flexibile. (Pentru o explicaţie completă a GNU face, a se vedea meciului fac sau mergi lawww.gnu.org ).

Makefile Structura

Scopul principal al face programului este de a asista compilarea şi recompilarea un program multi-fişier, astfel încât doar acele părţi ale programului sunt recompilate care necesita acest lucru. De exemplu, dacă un fişier header este schimbat, apoi fiecare fişier sursă care # include e acel fişier trebuie să fie recompilate. face vede un mecanism simplu prin care astfel de dependenţe (numite, de asemenea, condiţii ), pot fi urmărite.

Makefiles constau din norme, care descrie modul de a efectua comenzi. De exemplu, o regulă s-ar putea explica cum de a compila un fişier sursă singur, sau cum să legătură într-toate fişierele obiect în executabil, sau, poate, cum pentru a curăţa toate fişierele obiect. O regulă are forma următoare

<>ţintă: dependenţe comanda comanda... Ţintă este numele de regulă, de exemplu, numele de program sau fişier care urmează să fie elaborate. Prima regula dată în Makefile este implicit. Dependenţele sunt numele de fişiere (de multe ori nume de alte obiective, cum şi) pe care construcţia obiectivului depinde. Un obiectiv special, nu trebuie neapărat să aibă dependenţe. Comenzile sunt comenzile efective care urmează să fie executat momentul în care toate dependenţele sunt complete. Reţineţi că un <Tab> trebuie să fie utilizate pentru a liniuţă comenzile sub numele ţintă; dacă utilizaţi spaţii sau nu liniuţă veţi primi un mesaj (nu este pe deplin clar) de eroare. Makefile e poate conţine, de asemenea, definiţiile variabilă pentru a face fişierul poate mai simplu.

PSI Makefile s

Makefile s incluse în pachetul de PSI sunt complicate, în parte datorită mărimii a pachetului şi nevoia de portabilitate cod. PSI3 Makefile e sunt generate automat de intrare simplu, numit Makefile. în, princonfigura script în top- nivel $ director PSI. Acest script este proiectat pentru a examina sistemul de characterisctics specifice, cum ar fi locatii bibliotecă, opţiuni speciale de compilare, existenţa unor anumite fişiere antet sau funcţii, sau Fortran-C eco-Legătură convenţii, printre altele. Cu informaţiile pe care le obţine, se construieste numărul mare de Makefile e necesar pentru elaborarea de biblioteci PSI lui, utilităţi, şi module.

Ca un exemplu, luaţi în considerare Makefile în. fişierul asociat cu cscf :

<>SRCDIR = @ @ SRCDIR VPATH = @ @ SRCDIR includ.. / MakeVars PSILIBS =-lPSI_file30-lPSI_chkpt-lPSI_iwl-lPSI_psio-lPSI_ciomr-lPSI_ipv1 TRUESRC = \ cscf.c cleanup.c dft_inputs.c diis.c dmat.c \ dmat_2. c ecalc.c errchk.c findit.c \ formg2.c formgc.c formgo.c form_vec.c gprgid.c init_scf.c \ packit_c.c packit_o.c rdone.c rdtwo.c rotate_vector.c scf_input.c \ scf_iter c scf_iter_2.c schmit.c sdot.c shalf.c check_rot.c phases.c \. guess.c sortev.c occ_fun.c init_uhf.c cmatsplit.c dmatuhf.c \ findit_uhf.c uhf_iter.c schmit_uhf.c diis2_uhf c formg_direct.c \. orb_mix.c BINOBJ = $ (TRUESRC:% c =% o..) alloc = includ.. / MakeRules ifneq ($ (DODEPEND), nr) $ (BINOBJ:..% o =% d ): $ (DEPENDINCLUDE) includ $ (BINOBJ: o% =% d).. endif install_man:: cscf.1 $ (MKDIRS) $ (Mandir) / man1 $ (INSTALL_INCLUDE) $ ^ $ (Mandir) / man1

@ @ String directivele spune configura script în cazul în care pentru a insera anumite variabile este a determinat din sistem. Acest Makefile de intrare include, de asemenea, două externe Makefile s, MakeVars şiMakeRules, ambele care sunt în directorul părinte. Aceste fişiere conţin (nu în mod surprinzător) variabile numeroase necesar (de exemplu, numele compilatorului C locale) şi de norme (de exemplu, cum de a genera modulul propriu-zis) pentru compilarea şi instalarea de cscf. Fisiere similare există pentru bibliotecile PSI, de asemenea. Vă recomandăm să programatorului petrece ceva timp studiind PSI Makefile structura.


gătirea pentru a dezvolta noi PSI3 Codul

Având în vedere complexitatea PSI3 pachetului, perspectiva de a adăuga noi module sau bibliotecile poate părea descurajantă la început. Să supunem că doriţi să începeţi a scrie un nou modul numit great_code pentruPSI3. Următoarea serie de măsuri va genera directoarele corespunzătoare şi Makefile s pentru a începe. Pentru comoditate, directorul de nivel superior al programatorului PSI3 copac sursă vor fi denumite în continuare $ PSI3 şi directorul de nivel superior al zonei de compilare de la $ fix:
  1. Generaţi director nou în arborele sursa: mkdir $ PSI3/src/bin/great_code
  2. CD-ul $ PSI3/src/bin/great_code
  3. Copierea existent Makefile.in dintr-un alt modul: cp.. / cscf / Makefile.in.
  4. Editaţi Makefile.in, astfel încât listeaza numai fişierele sursă pentru great_code şi include în PSILIBS numai acele biblioteci necesare pentru legătură într-executabil.
  5. Revenire la partea de sus a arborelui sursa: cd $ PSI3
  6. Adăugaţi numele de great_code e Makefile la configure.ac (lângă partea de jos a fişierului) şi rulaţi autoconf pentru a genera un nou configure script.
  7. Du-te la partea de sus a arborelui de compilare: cd $ fix.
  8. Re-rulaţi scriptul configure a genera Makefile pentru great_code. Asiguraţi-vă că folosiţi aceleaşi opţiuni pentru a configura că aţi utilizat înainte sau alte Makefile s 'nu poate să funcţioneze corect. Comanda aţi utilizat înainte de a putea fi găsite în $ fix / config.status. (A se vedea, de asemenea, PSI3 manualul de instalare pentru mai multe detalii cu privire la opţiunile de configurare.)

Acum sunteţi gata pentru a lucra la cod. Modificări la fişierele sursă (inclusiv Makefile ar trebui să fie făcute la fişierele din $ PSI3/src/bin/great_code şi toate compilaţii trebuie să se desfăşoare în $ fix / src / bin / great_code.


Codul Debugging

Depanare PSI3 cod folosind un depanator interactiv, cum ar fi gdb sau dbx poate fi dificil uneori, din cauza organizării complicate a acestui pachet program de mari dimensiuni. Această secţiune discută unor strategii şi detaliile tehnice de utilizare a debugger-cu astfel de PSI3 cod.

Codul de Re-compilare

Orice secţiune a PSI3 cod care trebuie să fie depanat trebuie să fie prima re-compilate cu `` g-pavilion''pornit. Acest flag este setat în MakeVars fişierul în directorul de mai sus, fiecare modul sau Culegere de bibliotecă de cod sursă. De exemplu, pentru a porni de depanare în cscf program, s-ar curăţa mai întâi codul obiect existent din fixul $ / src / bin / cscf director utilizând face curat. Apoi, editaţi $ fix / src / bin / MakeVars, un director mai sus cscf codul sursa: set CDBG =-g şi, opţional, COPT = pentru a dezactiva opţiunile de optimizare. (Pentru module folosind C + +, variabilele analoage sunt CXXDBG şi CXXOPT Apoi, re-compila modulul.. În cazul în care informaţii de depanare, este nevoie de o rutina bibliotecă, cum şi, apoi urmaţi aceeaşi procedură pentru bibliotecă în cauză. Tehnic, doar rutina de dobânzii trebuie să fie re-compilat, deşi este adesea mai convenabil să pur şi simplu re-compila întreaga bibliotecă sau modul.

Directoare multiple Codul Sursa

Problema cea mai dificilă a depanare PSI3 cod este codul obiect şi codul sursă de şedere, în general, în directoare separate, pentru a permite depozitarea de obiecte pentru achitectures simultan mai multe. În plus, codurile de bibliotecă sunt ţinute separat de binar (modul) codurile. În cazul în care codul este compliled cu gcc / g + +, atunci aceasta separare de sursă şi cod obiect este lipsită de efect, deoarece compilatorul construieste calea completă la fişierul sursă direct în codul obiect. Cu toate acestea, pentru non- gcc compilaţii, trebuie să ştim cum să-i spuneţi depanatorul în cazul în care pentru a găsi surse.

Cele mai multe depanatoare interactive permit programator pentru a specifica mai multe directoare codul sursă căutare folosind simplu de linie de comandă de opţiuni. De exemplu, dacă cineva ar fi depanarea cscfprogramului şi aveau nevoie de acces la libciomr.a codul biblioteca sursă în plus faţă de faptul că de cscf, se poate folosi gdb e `` dir comandă''pentru a căuta mai multe directoare de cod sursă:

<>dir \ $ PSI / src / lib / libciomr În plus, comenzile pot fi plasate în ghidul de $ HOME /.gdbinit fişier. În dbx, `` utilizarea''comanda specifică directoare multiple sursă.


Documentaţie

Documentaţia este de multe ori singura legătură dintre autor şi codul de utilizatori codul lui. Utilitatea a codului va depinde în mare măsură de calitatea documentaţiei sale. Una dintre cele mai mari nu a codului PSI este că acesta conţine puţină nici o documentatie. Sustinem cu fermitate documentaţia de cel puţin primele două tipuri:
  1. O scurtă descriere a funcţiei codului şi cuvintele cheie trebuie să fie scrise pentru fiecare modul nou şi bibliotecă adăugată la PSI3 pachet.
    • Includerea directe în PSI3 manuale - binare (module) ar trebui să fie incluse în manualul de utilizare şi biblioteci în manualul programatorului.
    • Un UNIX om pagină - Acestea oferă `` rapid şi-murdar''acces la opţiunile de program, chiar atunci când conectat la distanţă, printr-o fereastră terminal. Un om pagină ar trebui să fie adăugate pentru fiecarePSI3 modul, şi acest lucru nu este greu când se lucrează pe un alt PSI3 om pagina ca un şablon. Pentru a accesa PSI3 omul pagini, va trebui să adăugaţi omul directorul de la dvs. MANPATH. De exemplu, dacă aveţi o csh sau tcsh, şi supunând că PSI3 a fost instalat în / usr/local/psi3-bin, următorul text pot fi adăugate la dvs. cshrc. sau tcshrc. fişier: <>setenv MANPATH / usr/local/psi3-bin/doc/man: / usr / share / om Calea omul obişnuit nu trebuie să se adaugă după PSI3 parte şi vor fi diferite pentru diferite sisteme. Diferite directoare sunt separate de doua puncte.
    • De asemenea, este util, în special pentru programe complexe sau biblioteci, pentru a avea documentaţie şi mai extinse. Anumite parti ale PSI3 au fost documentate în detaliu mai mult prin intermediul unor documente HTML (de exemplu, cints, libdpd, şi libpsio ). Aceste documente sunt stocate în directoarele asociate codul sursă şi instalat în directorul de instalare în conformitate cu doc / html.
  2. În al doilea rând, după cum am menţionat anterior, codul sursa ar trebui să fie documentate în mod direct de către liniile de comentariu în codul. Noi folosim o formatare specială pentru în-cod documentaţie, care este descris în detaliu în secţiunea 5.7.

Reţineţi, de asemenea, faptul că documentaţia completă ar trebui să includă, de asemenea, referiri la orice publicaţii relevante la care codul se poate baza.


Crearea de noi cazuri de încercare

PSI3 suita de testare este conceput pentru a maximiza reutilizarea codului şi să ofere de testare în $ fix înainte de PSI3 executabile au fost instalate. Scriptul configure $ în PSI3 va lua toate fişierele necesare în $ cu PSI3/tests în stub:. Makefile.in, MakeRules.in, MakeVars.in, şi runtest.pl.in, înlocuiţi cu parametri variabile sistem specific, şi copie / crea fişierele şi directoarele de testare în $ fix / teste. Testele ar trebui să fie executaţi în directorul de obiect înainte de instalare.

Dacă aţi adăugat doar un nou modul pentru efectuarea de, să zicem cu dispersie multireference cuplate, şi doriţi să adăugaţi un caz test pentru suita de teste curent, aici este ceea ce trebuie să faceţi.

  1. Copiaţi unul dintre directoarele existente, test-cheie pentru un director numit în mod corespunzător pentru cazul nou test.
  2. Creaţi un fişier de intrare corespunzătoare de funcţionare noul modul. Apoi, în cazul în care programul a produs datele corecte, redenumiţi fişierele de ieşire pentru a ref *.. Urmaţi convenţia de cazuri de testare existente.
  3. În cazul în caz de testare este mic, adăugaţi numele directorului pe lista de la $ PSI3/tests/Makefile.in. În cazul în care testul este deosebit de dificil, a se vedea psi_start sau rhf-stab cazuri de testare ca un exemplu.
  4. Toate funcţionalităţile de testare este situat în bibliotecă perl runtest.pl.in. Dacă sunteţi de testare pentru o cantitate care nu este cautat in zent, apoi se adaugă o funcţie la biblioteca de la formatul de funcţii deja disponibile. Dacă aţi adăugat funcţionalitatea de PSI3 conducătorului auto, asiguraţi-vă că pentru a actualiza funcţii adecvate în runtest.pl.in.
  5. Adaugă locaţia Makefile pentru cazul de testare la scriptul configure în PSI3 $.

Vă rugăm să contactaţi unul dintre autorii de PSI3 înainte de a face orice modificări majore sau dacă aveţi o problemă la adăugarea unui caz nou test. Amintiţi-vă, dacă tot nu, citiţi codul sursă.


Consideraţii speciale

Ceea ce urmează este o listă de elemente de construcţii, care ar trebui să fie păstrate în minte în timp ce în curs de dezvoltare cod PSI.

Malloc () invită IBM :
Curent IBM compilatoare (Visual Varsta C / C + + 5) nu în mod corespunzător prototip malloc () decât dacă una include stdlib.h. Vă rugăm să asiguraţi-vă că # include <cstdlib> oricând apelaţimalloc () într-un fişier. Dacă uitaţi, se va lucra în continuare în GCC, dar nu şi pe un IBM.


PSI3 de referinţă

T. Daniel Crawford, C. David Sherrill, Edward F. Valeev, Justin T. Fermann, Rollin A. King, Matei L. Leininger, Shawn T. Brown, Curtis L. Janssen, Edward T. Seidl, Joseph P. Kenny, Wesley şi D. Allen, J.Calculatoare. Chim. 28, 1610-1616 (2007).


Fişiere text în PSI3

Psi utilizează mai multe fişiere text pentru a stoca anumite tipuri de informaţii. Stocare a informaţiilor în fişiere de text face mult mai uşor pentru utilizatori să inspecteze şi să manipuleze aceste informaţii, cu condiţia ca ghidul de înţelege formatul de fişier pe care. În următoarele descrieri format de fişier, voi folosi notaţia $ {X_i, y_i,} $şi $ {Z_i} $pentru a indica x, y şi z coordonatele de nucleu i, respectiv, $ {\ Eta_ {i}} $va indica $ {I ^ {\ rm-lea}} $coordona interne, şi E se va indica suma de energie electronice şi energia nucleară repulsie.

<> geom.dat

Un format vectorized care este adecvată pentru rutine în libipv1 iomr sau este angajat în geom.dat În general, prima linie de geom.dat este

<>%% Deşi acest lucru nu afectează rutine parsarea în libipv1, sau la oricare dintre programele comune care citeşte geom.dat (de exemplu rgeom sau ugeom ), unele PSI2 module ( bmat, etc) de aşteptat această linie şi ar încurca până geom.dat în cazul în care nu este zent. geom.dat au în mod frecvent mai multe intrări, cu cel mai de sus fiind adăugarea cea mai recentă de către bmat.

Format: n = numărul de atomi.

$ \ Displaymath \ begin {array} {lcccr} {\ tt geometrie = (} \ \ {\ tt (} x_1 & \ hspace {0...... n} & y_n \ hspace {0.8in} & z_n \ hspace {0.8 in} & {\ tt)} \ \ \ \ {\ tt)} \ end {array} $ (1)

Geometrii Alte acelaşi format poate urma. <> fconst.dat

Acest fişier conţine matricea de forţă constantă produsă de optking sau intder95. Deoarece matricea este simetrică forţă constantă, doar diagonală mai mică este stocat aici. Matricea forţă constantă poate fi rezentat în coordonate carteziene, fie interne sau, în funcţie de ce opţiuni au fost utilizate atunci când intder95 fost executaţi pentru a produce fconst.dat. optking este programul care foloseste fconst.dat cel mai frecvent, şi se supune că matricea forţă constantă va fi, în termeni de coordonate interne, astfel cum sunt definite în input.dat sau intco.dat. Din acest motiv, este cel mai bine este de a avea intder95 produce o fconst.datîn coordonate interne. Ordinea de coordonate interne este determinată de ordinea stabilită în input.dat sau intco.dat. Simetrică în totalitate coordonatele sunt pe primul loc, urmat de toate coordonatele asimetrice.

În următorul format, $ {{F_ \ eta_i}} $este forta constanta pentru coordonarea internă $ {\ Eta_i} $şi este forta constanta pentru deplasarea mixt de coordonate interne i şi j. $ {{F_ \ eta_i, \ eta_j}} $

Format: n = numărul total de coordonate interne în intco.dat sau input.dat.

$ \ Displaymath \ begin {array} {lllll} {f_ \ eta_1} \ \ {f_ \ eta_2, \ eta_1} & f_ {\ eta_2...... {\ Eta_ {n}, \ eta_2} & f_ {\ eta_ {n}, \ eta_3} & \ cdots f_ {& \ eta_ {n}} \ \ \ end {array} $ (2)

În cazul în care matricea forţă constantă este stocat in coordonate carteziene, cu toate acestea, formatul, folosind o notatie similara, cu n acum egal cu numărul total de atomi, este după cum urmează:
$ \ Displaymath \ begin {array} {} llllll f_ {x_1} \ \ f_ {y_1, x_1} & f_ {y_1} \ \ f_ {z_...... 1} & f_ {z_n, y_1} & f_ {z_n, z_1} & f_ {z_n, x_2} & \ cdots f_ {& z_n} \ \ \ end {array} $ (3)

<> file11.dat

Numărul de atomi ( N ), energia totală astfel cum a zis de undă finală, geometrie carteziene, degradeuri carteziene, taxele atomice ( Z$ $ _i ) şi o etichetă sunt toate cuprinse în file11. Natura exactă a etichetei depinde de tipul de undă pentru care gradientul a fost calculată. Prima parte a etichetei este determinată de cuvântul cheie etichetă în input.dat. Dacă un gradient de CSA se execută, apoi tipul de calcul ( calctype ), şi tipul de instrumente financiare derivate ( dertype ) va apărea, de asemenea. Dacă un gradient corelat a fost rulat, calctype [CI, CCSD, sau CCSD (T)] şi tipul de instrumente financiare derivate (FIRST) apar. file11 au în mod frecvent mai multe intrări, cu intrarea ultima fiind cele mai recente plus de cints-deriv1.

Format:

$ \ Displaymath \ begin {array} {l} eticheta \ hspace {} 0.5in calctype \ hspace {} 0.5in dert...... {\ Delta E} {\ Delta y_n} & \ frac {\ delta E} {\ delta z_n} \ \ \ end {array} \ end {array} $ (4)

<> file12.dat

Valorile interne coordoneze şi gradienţi, numărul de atomi ( n ), iar energia totală ( E ), poate fi găsit în file12. file12 este produsă de intder95, care poate converti degradeuri carteziene în degradeuri interne. În general, file12 va avea mai multe înregistrări, cu fiecare intrare corespunde o intrare în file11 de interes.

Format:

\ Begin {displaymath} \ begin {array} {l} n \ hspace {1.5in} E \ \ \ begin {array} {cc} \ v...... LTA E} {\ delta \ eta_n} \ hspace {1.2in} \ \ \ end {array} \ end {array} \ end {displaymath} (5)

<> file12a.dat Pentru a calcula derivatele de la două degradeuri făcută la geometrii finit strămutate dintr-o geometrie special, intdif necesită o file12a. Acest fişier conţine, în esenţă, aceleaşi informaţii ca file12, dar fiecare intrare are, de asemenea, informaţii cu privire la care să coordoneze intern ( numintco ) a fost strămutate în calculul gradientului şi de cât de mult ( DISP ), a fost deplasată.

Format:

\ Begin {displaymath} \ begin {array} {l} numintco \ hspace {} 0.5in disp \ hspace {1.5in} E \...... ELTA E} {\ delta \ eta_n} \ hspace {0.8in} \ \ \ end {array} \ end {array} \ end {displaymath} (6)

<> file15.dat

Matricea Hessian carteziene se găseşte în file15. Prima linie a acestui fişier dă numărul de atomi ( n ) şi, în cazul în care sunteţi curioşi, de şase ori numărul de atomi ( sixtimesn ).

Format:

\ Begin {displaymath} \ begin {array} {l} n \ hspace {} 0.4in sixtimesn \ \ \ begin {array }{...... E} {\ delta ^ 2 z_n} \ hspace {0.3in} \ \ \ par \ end {array} \ end {array} \ end {displaymath} (7)

<> file16.dat Derivate al doilea total de energie cu privire la coordonatele interne se găsesc în file16. Ca şi în file15, numărul de atomi ( n ) şi de şase ori acel număr ( sixtimesn ) sunt date.

Format:

\ Begin {displaymath} \ begin {array} {l} n \ hspace {} 0.4in sixtimesn \ \ \ begin {array }{...... {\ Delta ^ 2 \ eta_n} \ hspace {0.3in} \ \ \ par \ end {array} \ end {array} \ end {displaymath} (8)

<> file17.dat Derivaţii primul dintre momentele de dipol cartezian ( ), cu privire la coordonatele carteziene nucleare pot fi găsite în file17. Prima linie şi format ulterioare sunt similare cu cea a file15. $ {\ Mu_x, \ mu_y, \ mu_z} $

Format:

\ Begin {displaymath} \ begin {array} {l} n \ hspace {} 0.4in threetimesn \ \ \ begin {array...... LTA \ mu_z} {\ delta z_n} \ hspace {0.3in} \ \ \ end {array} \ end {array} \ end {displaymath} (9)

<> file18.dat Derivaţii primul dintre momentele de dipol cartezian ( ), cu privire la coordonatele interne nucleare pot fi găsite în file18. $ {\ Mu_x, \ mu_y, \ mu_z} $

Format:

\ Begin {displaymath} \ begin {array} {l} n \ hspace {} 0.4in threetimesn \ \ \ begin {array...... Mu_z} {\ delta \ eta_ {n}} \ hspace {0.3in} \ \ \ end {array} \ end {array} \ end {displaymath} (10)

Des acest document...

Acest document a fost generat folosind LaTeX 2 HTML versiunilor traducator 2002-2-1 (1.71)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, unitate de învăţare pe calculator, Universitatea din Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Departamentul de Matematică, Universitatea Macquarie, Sydney.

Argumentele au fost în linie de comandă: latex2html -tmp / tmp-dir / home/users/crawdad/src/psi-3-4/objdir-diadem-gcc/doc/progman/html-external_file / home / users / crawdad / src / psi-3-4/objdir-diadem-gcc/doc/progman/progman-mkdir-local_icons-split 0 / home/users/crawdad/src/psi-3-4/doc/progman/progman.tex

Traducere a fost iniţiată de către T. Daniel Crawford pe 2009-02-16


Note de subsol

... Funcţia 1
În urma convenţiei din C, funcţia de cuvinte şi subrutina vor fi folosite alternativ.
... C. 2
C + +, care include o mare parte din codul actual in fisiere antet, este o chestiune diferită.
... common.h ). 3
A se vedea pagina 33 din Kernighan si Ritchie, două Ed., Pentru o explicaţie a declaraţiei definiţie vs.
Published (Last edited): 05-01-2012