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

⟦3001f6a1c⟧ TextFile

    Length: 9216 (0x2400)
    Types: TextFile
    Names: »nllphtx«

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_ph_tx             * page 1    2 11 79, 15.47;  

;  nll_ph
;  ******

if listing.yes
char nl ff nl

nll_ph = set 1

nll_ph = algol

external integer procedure nll_ph
_________________________________
_           (OC_a, unk, cca, obs_count, sol);  
value              unk,      obs_count, sol;  
array        OC_a;  
integer            unk,      obs_count;  
integer array           cca;  
boolean                                 sol;  

comment

nll_ph             (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_ph.

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)

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

_
ext. used
__________
abs_addr
to_epu

Prog:  Knud Poder, 8 OCT 1979
GI_nr: 79013;  

\f



comment nll_ph_tx             * page 2    2 11 79, 15.47
0 1 2 3 4 5 6 7 8 9 ;  

begin

  zone                     epu(((unk+2)*(unk+1)*9+9)//4, 1,  
  _                            nll_block);  

  integer                  t, t1, t2, unk1, row, col, rep, 
  _                        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, epu_lng, epu_max;  

  real                     enp_sum;  

  array                    status(0:unk+1);  

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

  integer array field      word;  

  boolean                  neg_dia;  

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

  _
  comment init of variables;  
  __________________________
  unk1    := if sol then (unk + 1) else unk;  
  epu_lng := (((unk + 2)*(unk + 1)*9 + 9)//4)*4;  
  epu_max := epu_lng - 24;  
  open(epu, 14, <:ympe:>, 55 shift 17);  
  outrec_6(epu, epu_lng);  
  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;  

  _
  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;  
  ________________________________
  rep := -1;  

\f



comment nll_ph_tx             * page 3    2 11 79, 15.47
0 1 2 3 4 5 6 7 8 9 ;  

  repeat
  begin
    rep := rep + 1;  

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

    _
    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 + t shift 2;  
        epu.word(9) := 0;  
        word        := word + 18;  
      end t1-loop;  
    end t-loop;  

    to_epu(epu, word, epu_lng, false);  

    _
    comment check dia_results;  
    __________________________
    neg_dia := false;  
    for t := 1 step 1 until unk do
    neg_dia := neg_dia or 
    _          (status(t) shift (-24)) extract 24 = 2;  

    if neg_dia then
    begin
      t2 := 0;  
      write(out, nl, 2, <:nllph error, rep:>, 
      _     <<dd>, rep, nl, 1);  
      for t := 1 step 1 until unk do
      begin
        write(out, nl, 1, <<__-dddd>, 
        _     (status(t) shift (-24)) extract 24);  
        for t1 := 1 step 1 until t do
        begin
          t2 := t2 + 1;  
          write(out, nl, if t1 mod 4 = 1 then 1 else 0, 
          <<__-d.ddd'-ddd>, OC_a(t2));  
        end t1-loop;  
      end t-loop;  
    end neg_dia output;  

  end rep-loop;  
  until rep = 5 or -, neg_dia;  

\f



comment nll_ph_tx             * page 4    2 11 79, 15.47
0 1 2 3 4 5 6 7 8 9 ;  

  _
  comment back-sol of normals;  
  ____________________________
  if sol then
  begin

    row := ((unk1 + 1)*unk1)//2;  
    col := row - unk;  

    _
    comment pseudo-enp;  
    ___________________
    OC_a(row+1) :=
    enp_sum     := 0;  
    for t := row - 1 step -1 until col do
    enp_sum := enp_sum + OC_a(t)**2;  
    OC_a(row+1) := sqrt(enp_sum);  

    _
    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

  <*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;  

\f



comment nll_ph_tx             * page 5    2 11 79, 15.47
0 1 2 3 4 5 6 7 8 9 ;  

    _
    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;  
          if word > epu_max then
          to_epu(epu, word, epu_lng, false);  
        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
    to_epu(epu, word, epu_lng, false);  

  end no sol clause;  
\f



comment nll_ph_tx             * page 6    2 11 79, 15.47
0 1 2 3 4 5 6 7 8 9 ;  

  _
  comment disconnect epu;  
  _______________________
  changerec_6(epu, 0);  
  close(epu, true);  

end nll_ph;  

end

if ok.no
mode warning.yes

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

end

finis
▶EOF◀