source: ThirdParty/mpqc_open/src/lib/util/psi3/libpsio/write_block.cc@ 00f983

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_levmar Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since 00f983 was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 2.6 KB
Line 
1/*!
2 \file write_block.c
3 \ingroup (PSIO)
4*/
5
6#include <stdlib.h>
7#include <string.h>
8#include <util/psi3/libpsio/psio.h>
9
10namespace psi3 {
11namespace libpsio {
12
13/*!
14** PSIO_WRITE_BLOCK():
15**
16** \ingroup (PSIO)
17*/
18
19int psio_write_block(unsigned int unit, char *key, char *buffer, ULI blksiz,
20 ULI start_blk, ULI end_blk)
21{
22 ULI size, shift;
23 psio_ud *this_unit;
24 psio_tocentry *this_entry, *last_entry;
25 psio_address sadd, eadd;
26
27 this_unit = &(psio_unit[unit]);
28
29 /* Find the entry in the TOC */
30 this_entry = psio_tocscan(unit, key);
31
32 if(this_entry == NULL) { /* New TOC entry */
33 if(start_blk) psio_error(unit,PSIO_ERROR_BLKSTART);
34
35 this_entry = (psio_tocentry *) malloc(sizeof(psio_tocentry));
36 strcpy(this_entry->key,key);
37 this_entry->next = NULL;
38 this_entry->last = NULL;
39
40 /* Compute the address of the entry */
41 if(!(this_unit->toclen)) { /* First TOC entry */
42 this_entry->sadd.page = 0;
43 this_entry->sadd.offset = 3*sizeof(ULI);
44
45 this_unit->toc = this_entry;
46 }
47 else { /* Use ending address from last TOC entry */
48 last_entry = psio_toclast(unit);
49 this_entry->sadd = last_entry->eadd;
50
51 last_entry->next = this_entry;
52 this_entry->last = last_entry;
53 }
54
55 /* Data for the write call */
56 size = (end_blk - start_blk + 1)*blksiz;
57 sadd = this_entry->sadd;
58
59 /* Set end address for this_entry */
60 this_entry->eadd = psio_get_address(this_entry->sadd, size);
61
62 /* Update the unit's TOC stats */
63 this_unit->toclen++;
64 this_unit->tocaddress = this_entry->eadd;
65 }
66 else { /* Old TOC entry */
67
68 size = (end_blk - start_blk + 1) * blksiz; /* The total buffer size */
69 shift = start_blk * blksiz; /* Number of bytes to shift from start */
70
71 /* Compute the starting page and offset for the block */
72 sadd = psio_get_address(this_entry->sadd, shift);
73
74 /* Make sure this block doesn't start past the end of the entry */
75 if(sadd.page > this_entry->eadd.page)
76 psio_error(unit,PSIO_ERROR_BLKSTART);
77 else if((sadd.page == this_entry->eadd.page) &&
78 (sadd.offset > this_entry->eadd.offset))
79 psio_error(unit,PSIO_ERROR_BLKSTART);
80
81 /* Compute the new ending address for the entry, if necessary */
82 eadd = psio_get_address(sadd, size);
83 if(eadd.page > this_entry->eadd.page) {
84 this_entry->eadd = this_unit->tocaddress = eadd;
85 }
86 else if((eadd.page == this_entry->eadd.page) &&
87 (eadd.offset > this_entry->eadd.offset))
88 {
89 this_entry->eadd = eadd;
90 this_unit->tocaddress = eadd;
91 }
92 }
93
94 /* Now write the actual data to the unit */
95 psio_rw(unit, buffer, sadd, size, 1);
96
97 return(0);
98}
99
100}
101}
Note: See TracBrowser for help on using the repository browser.