VMM_EXAMPLE(1) VERSION 1.0 VMM_EXAMPLE(1) DESCRIPTION The tstvmm program following is meant to serve as an example of the fashion in which the VMM package should be used. First, the variables are created. The desired slices are then loaded simultaneously into central memory. Once loaded, the pointers to the slices are obtained. It is the acquisition of these pointers that allows the user to work with the contents of the loaded slices. Once the pointer has been granted, the slice becomes locked in memory; that is to say, that none of the functions of the VMM package will attempt to move the field to a new memory location. For our example, we intend to use the variables for a restart later on. So after all the desired work has been performed, a check point is done (i.e., all fields are saved to disk by a call to vmmcpk). PROGRAM TSTVMM program tstvmm integer cle1,cle2,cle3,cle4, clefs(4) real array1,array2,array3,array4,hparray pointer (ptr1,array1(50)) pointer (ptr2,array2(50)) pointer (ptr3,array3(100)) pointer (ptr4,array4(100)) pointer (ptrhpa,hparray(500)) integer vmmallc,vmmcre,vmmlod,vmmget,vmmulk, vmmuld, vmmrls integer vmmsav,vmmfgt,vmmdbg,vmmhpa,vmmhpd,vmmdiag,vmmcpk * allocating 275 words for VMM ier = vmmallc(275) * setting the vmm output file to vmm_out ier = vmmdbg('OUTFILE=vmm_out',0,0) * creation of the variables cle1 = vmmcre('VAR #1',50, 5,'SAVE=Y,CL=1,W=9,INIT=R,SIZE=0') cle2 = vmmcre('VAR #2',50, 5,'SAVE=N,CL=2,W=8,INIT=0') cle3 = vmmcre('VAR #3',100,5,'SAVE=Y,CL=2,W=7,INIT=-,SIZE=0') cle3 = vmmcre('VAR #4',100,5,'SAVE=Y,CL=4,W=7,INIT=-,SIZE=0') * putting trace mode on for all variables ier = vmmdbg('TRACE',-1,0) * begin loop on all five slices do 100 i = 1, 5 * create the list of slices and load them clefs(01) = cle1 +i clefs(02) = cle2 +i clefs(03) = cle3 +i clefs(04) = cle4 +i ier = vmmlod(clefs,3) * obtain the pointers to the three loaded slices ier = vmmget(clefs(01),ptr1,junk) ier = vmmget(clefs(02),ptr2,junk) ier = vmmget(clefs(03),ptr3,junk) * do whatever work there is to do with these fields call somework(array1, array2, array3,50,50 100) * replace VAR #1 with VAR #4 (see discussion below) ier = vmmuld(clefs(01),1) ier = vmmulk(clefs(02),2) ier = vmmlod(clefs(04),1) * get new pointers (fields have been moved in memory) ier = vmmget(clefs(02),ptr2,junk) ier = vmmget(clefs(03),ptr3,junk) ier = vmmget(clefs(04),ptr4,junk) call morework(array2,array3,array4,50,50,100) * unload slices and load next ones ier = vmmuld(-1,0) 100 continue PROGRAM TSTVMM (continued) * reload slice 1 of VAR #1 and * allocate a 500 word work field and do more work ier = vmmlod(cle1,1) ier = vmmget(cle1,ptr1,junk) ier = vmmhpa(ptrhpa,500,1) call nothing(array1,hparray,50,500) * return work space ier = vmmhpd(ptrhpa) * save slice 1 of VAR #1 to disk and release it ier = vmmsav(cle1,1) ier = vmmrls(cle1,1) * load slice 2 'VAR #1', 'VAR #2' and 'VAR #3' clefs(01) = cle1 +2 clefs(02) = cle2 +2 clefs(03) = cle3 +2 ier = vmmlod(clefs,3) * get the pointers ier = vmmget(cle1+2,ptr1,junk) ier = vmmget(cle2+2,ptr2,junk) ier = vmmget(cle3+2,ptr3,junk) * do final work call finlwork(array1,array2,array3,50,50,100) * forget slice 2 of 'Var #1' ier = vmmfgt(cle1+2,1) * do a check point ier = vmmcpk() * get diagnostics on use of vmm ier = vmmdiag() stop end Some comments should be made about the field loading/unloading portion of code that is enclosed in the loop. Note first, that after the initial call to vmmlod, there are only 75 words of free memory remaining. If we wish to substitute the slice of VAR #1 by that of VAR #4, it is therefore necessary to first unload the VAR #1 slice and to unlock the other variables. An unload renders a field "ejectable" from memory while an unlock renders a field "moveable" in memory. The subsequent call to vmmlod (for the slice of VAR #4) will force the write to disk and ejection from memory of the VAR #1 slice followed by a memory displacement of the remaining slices. The space thus created will then be large enough to accommodate the 100 words of the VAR #4 slice. You will further notice that we requested new pointers for all the variables loaded in memory. Indeed, it would be a mistake to try to access a field through the old pointer. For instance, the pointer ptr2 which originally pointed to the VAR #2 slice, will point to the VAR #3 slice after the loading of VAR #4 has been done. Refer to the memory representations to see why. Memory representation after the first vmmlod: MEMORY: | VAR #1 | VAR #2 | VAR #3 | | Length in words: 50 50 100 75 Attributes : keep in core keep in core keep in core unused Memory representation after the vmmuld and vmmulk: MEMORY: : | VAR #1 | VAR #2 | VAR #3 | | Length in words: 50 50 100 75 Attributes : ejectable keep in core keep in core unused Memory representation after the vmmlod for VAR #4: MEMORY: | VAR #2 | VAR #3 | VAR #4 | | Length in words: 50 100 100 25 Attributes : keep in core keep in core keep in core unused AUTHORS J.Caveen, M.Lepine, M.ROCH - RPN NOTES Latest revision, November 1993 See also vmmallc(3), vmmatt(3), vmmcks(3), vmmcpk(3), vmmcre(3), vmmdbg(3), vmmdiag(3), vmmdmp(3), vmmfgt(3), vmmget(3), vmmhpa(3), vmmhpd(3), vmmint(3), vmmintro(1), vmmlck(3), vmmlod(3), vmmlse(3), vmmpak(3), vmmpwd(3), vmmrls(3), vmmrnm(3), vmmsav(3), vmmuld(3), vmmulk(3), vmmuln(3).