DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦f6ea13d62⟧ TextFile

    Length: 8448 (0x2100)
    Types: TextFile
    Names: »nlloctx«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦787c125fb⟧ »adjprocfile« 
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦787c125fb⟧ »adjprocfile« 
            └─⟦this⟧ 

TextFile



;       nll_oc_tx             * page 1   15 03 78, 11.14;  

;  nll_oc
;  ******

if listing.yes
char nl ff nl

nll_oc = set 1

nll_oc = algol

external integer procedure nll_oc
_________________________________
_           (OC_a, unk, cca, obs_count, epu, epu_lng, sol);  
value              unk,      obs_count,      epu_lng, sol;  
array        OC_a;  
integer            unk,      obs_count,      epu_lng;  
integer array           cca;  
zone                                    epu;  
boolean                                               sol;  

comment

nll_oc             (return, integer proc)
service proc for orientation unknowns. the procedure has
a value equal to the array field value for the unknowns
in the array OC_a in the sol case. the value in the -, sol
case is irrelevant.

OC_a                (array, return)
work array of length at least 1 : (unk+1)*(unk+2)//2.
the array needs no initialization and should not be a
fielded array. the content becomes the upper triangular 
CHOLESKY matrix, and when sol is true also the solutions, 
fielded by the value of nll_oc.

unk                 (call, integer)
the number of unknowns

cca                 (call, integer array)
the abs addr of the first elements in each col of obs-eq incl.
the rhs. the last is not used in the -, sol case, but then  
cca(0)      = first oc coeff in obs-eq coeff, 
cca(unk+2)  = first coord col addr in the array pointed by cca
_             the cols must be consecutive
cca(unk+3)  = coord_pr_stat
cca(unk+4)  = eq_pr_stat

obs_count           (call, integer)
the number of obs_eq (mostly observations*eq_pr_stat)

epu                 (call and return, zone)
a zone buffer opened to the epu and after an outrec_6 of the
full buffer length. the zone is left in the same state. the
zone should have not less than 4*24 bytes.

epu_lng             (call, integer)
the zone buffer length in bytes

sol                (call, boolean)
true when the orientation unknowns are computed and false
when their cholesky reduction is done

\f



comment nll_oc_tx             * page 2   15 03 78, 11.14
0 1 2 3 4 5 6 7 8 9 ;  

comment
_
ext. used
__________
abs_addr

Prog: Knud Poder, 19 FEB 1978

GI_nr: 78010

;  

begin

  integer                  t, t1, unk1, row, col, 
  _                        coef_pnt, coef_step, status_addr, 
  _                        coord_pr_stat, eq_pr_stat, 
  _                        cca_disp, cca_step, 
  _                        z_mla_obs_count, mls_m1, z_mls_m1, 
  _                        epu_op, chl_30, stp_1;  

  real                     status;  

  integer array            cwa(1:unk+1), coord_pnt(1:3);  

  integer array field      word;  

  _
  comment proc value;  
  ___________________
  nll_oc := (unk + 1)*unk*2;  

  _
  comment init of variables;  
  __________________________
  unk1    := if sol then (unk + 1) else unk;  
  epu_lng := epu_lng - 24;  
  word    := 0;  

  _
  comment epu-instr;  
  __________________
  zmla_obs_count := 1 shift 23 + 2 shift 12 +  obs_count;  
  mls_m1         := 0 shift 23 + 3 shift 12 -  1;  
  z_mls_m1       := 1 shift 23 + 3 shift 12 -  1;  
  chl_30         := 0 shift 23 + 8 shift 12 + 30;  
  stp_1          :=           4095 shift 12 +  1;  

  _
  comment abs_addresses;  
  ______________________
  status_addr := abs_addr(status);  
  cwa(1)      := abs_addr(OC_a) + 4;  
  for t := 1 step 1 until unk do
  cwa(t+1) := cwa(t) + 4*t;  

  _
  comment reduction of oc-normals;  
  ________________________________

  _
  comment clear orientation normals;  
  __________________________________
  for t := ((unk1 + 1)*unk1)//2 step - 1 until 1 do
  OC_a(t) := 0.0;  

\f



comment nll_oc_tx             * page 3   15 03 78, 11.14
0 1 2 3 4 5 6 7 8 9 ;  

  _
  comment orientation normals;  
  ____________________________
  for t := 1 step 1 until unk1 do
  begin
    for t1 := 1 step 1 until t do
    begin
      epu.word(1) := zmla_obs_count;  
      epu.word(2) := cca(t);  
      epu.word(3) := cca(t1);  
      epu.word(4) := mls_m1 + t1;  
      epu.word(5) := cwa(t);  
      epu.word(6) := cwa(t1);  
      epu.word(7) := chl_30;  
      epu.word(8) := status_addr;  
      epu.word(9) := 0;  
      word        := word + 18;  

      _
      comment test epu action;  
      ________________________
      if word > epu_lng then
      begin
        epu.word(1) := stp_1;  
        changerec_6(epu, word + 6);  
        outrec_6(epu, epu_lng + 24);  
        word := 0;  
      end;  
    end t1-loop;  
  end t-loop;  

  _
  comment start epu;  
  __________________
  if word <> 0 then
  begin
    epu.word(1) := stp_1;  
    changerec_6(epu, word + 6);  
    outrec_6(epu, epu_lng + 24);  
    word := 0;  
  end;  

  _
  comment back-sol of normals;  
  ____________________________
  if sol then
  begin
 
 
 
 
 
    row := ((unk1 + 1)*unk1)//2;  
    col := row - unk;  
  
_
comment pseudo-enp;
___________________
OC_a(row+1) :=
status      := 0;
for t := row - 1 step -1 until col do
status := status + OC_a(t)**2;
OC_a(row+1) := sqrt(status);
 
_
comment mean error;
___________________
if obs_count - unk > 0 then
OC_a(row) := OC_a(row)/sqrt(obs_count - unk);

_
comment back-sol;
_________________
    for t := unk - 1 step -1 until 0 do
    begin
      row       := row - 1;  
      col       := col - 1;  
      OC_a(row) := OC_a(row)/OC_a(col);  
      for t1 := 1 step 1 until t do
      begin
        col          := col - 1;  
        OC_a(row-t1) := OC_a(row-t1) - OC_a(row)*OC_a(col);  
      end t1-loop;  
    end t-loop;  

  end sol-clause

  else

\f



<*       nll_oc_tx             * page 4   15 03 78, 11.14
0 1 2 3 4 5 6 7 8 9 *>

  <*reduce oc-normal coeff*>
  __________________________
  begin
    coef_pnt      := cca(0);  
    coord_pnt(1)  := cca(unk+2);  
    coord_pr_stat := cca(unk+3);  
    eq_pr_stat    := cca(unk+4);  
    for col := 2 step 1 until coord_pr_stat do
    coord_pnt(col) := coord_pnt(col-1) + 4*obs_count;  
    cca_disp      := 0;  
    cca_step      := 4*eq_pr_stat;  
    coef_step     := 4*unk;  
    obs_count     := obs_count//eq_pr_stat;  
    epu_op        := 1 shift 23 + 2 shift 12 <*z_mla*>
    _              + eq_pr_stat;  

    _
    comment clear oc part of coef_zn;  
    _________________________________
    epu.word(1) := 1 shift 23 + 4 shift 12 <*clear and store*> 
    _            + coord_pr_stat*unk*obs_count;  
    epu.word(2) :=
    epu.word(3) := coef_pnt;  
    word        := word + 6;  

    _
    comment loop over objects;  
    __________________________
    for t := 1 step 1 until obs_count do
    begin

      _
      comment loop over coord cols;  
      _____________________________
      for col := 1 step 1 until coord_pr_stat do
      begin

        _
        comment col of oc-oc coeff;  
        ___________________________
        for t1 := 1 step 1 until unk do
        begin
          epu.word(1) := epu_op;  
          epu.word(2) := coord_pnt(col) + cca_disp;  
          epu.word(3) := cca(t1) + cca_disp;  
          epu.word(4) := mls_m1 + t1;  
          epu.word(5) := coef_pnt;  
          epu.word(6) := cwa(t1);  
          epu.word(7) := chl_30;  
          epu.word(8) := status_addr;  
          epu.word(9) := 0;  
          word        := word + 18;  

\f



comment nll_oc_tx             * page 5   15 03 78, 11.14
0 1 2 3 4 5 6 7 8 9 ;  

          _
          comment test epu action;  
          ________________________
          if word > epu_lng then
          begin
            epu.word(1) := stp_1;  
            changerec_6(epu, word + 6);  
            outrec_6(epu, epu_lng + 24);  
            word := 0;  
          end;  
        end t1-loop;  

        _
        comment move obs-eq coef-pointer;  
        _________________________________
        coef_pnt  := coef_pnt  + coef_step;  

      end col-loop;  

      _
      comment move oc-array pointer;  
      ______________________________
      cca_disp  := cca_disp  + cca_step;  

    end t-loop;  

    _
    comment start epu;  
    __________________
    if word <> 0 then
    begin
      epu.word(1) := stp_1;  
      changerec_6(epu, word + 6);  
      outrec_6(epu, epu_lng + 24);  
      word := 0;  
    end;  

  end no sol clause;  

end nll_oc;  

end

if ok.no
mode warning.yes

if warning.yes
(mode 0.yes
message nll_oc not ok
lookup nll_oc)

end

▶EOF◀