]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Convert tests to use AffineConstraints::constrain_dof_to_zero().
authorWolfgang Bangerth <bangerth@colostate.edu>
Thu, 19 Oct 2023 20:37:40 +0000 (14:37 -0600)
committerWolfgang Bangerth <bangerth@colostate.edu>
Mon, 23 Oct 2023 17:13:16 +0000 (11:13 -0600)
37 files changed:
tests/data_out/data_out_curved_cells.cc
tests/fe/fe_enriched_step-36b.cc
tests/integrators/assembler_simple_system_inhom_01.cc
tests/lac/affine_constraints_set_zero.cc
tests/lac/constraint_matrix_distribute_local_global.cc
tests/lac/constraints_01.cc
tests/lac/constraints_hanging_nodes_bc.cc
tests/lac/constraints_make_consistent_in_parallel_01.cc
tests/lac/constraints_merge_12.cc
tests/lac/constraints_move.cc
tests/lac/constraints_zero_condense.cc
tests/lac/inhomogeneous_constraints.cc
tests/lac/inhomogeneous_constraints_04.cc
tests/lac/inhomogeneous_constraints_block.cc
tests/lac/inhomogeneous_constraints_nonsymmetric.cc
tests/matrix_free/matrix_vector_mg.cc
tests/matrix_free/parallel_multigrid.cc
tests/matrix_free/parallel_multigrid_fullydistributed.cc
tests/matrix_free/parallel_multigrid_interleave.cc
tests/matrix_free/parallel_multigrid_interleave_renumber.cc
tests/matrix_free/parallel_multigrid_mf.cc
tests/matrix_free/step-37.cc
tests/mpi/constraint_matrix_set_zero_01.cc
tests/mpi/constraint_matrix_set_zero_02.cc
tests/mpi/constraints_crash_01.cc
tests/mpi/constraints_crash_02.cc
tests/mpi/constraints_crash_03.cc
tests/mpi/crash_05.cc
tests/multigrid-global-coarsening/parallel_multigrid.cc
tests/multigrid-global-coarsening/parallel_multigrid_fullydistributed.cc
tests/multigrid-global-coarsening/parallel_multigrid_interleave.cc
tests/multigrid-global-coarsening/parallel_multigrid_interleave_renumber.cc
tests/multigrid-global-coarsening/parallel_multigrid_mf.cc
tests/multigrid/constrained_dofs_07.cc
tests/multigrid/transfer_matrix_free_13.cc
tests/multigrid/transfer_prebuilt_05.cc
tests/remote_point_evaluation/vector_tools_evaluate_at_points_02.cc

index 5a101915d5480a0dec6216c992c1efbafed0993c..fdce46183a25ac914207bb188d8e16e0f1aa5277 100644 (file)
@@ -158,7 +158,9 @@ curved_grid(std::ostream &out)
       for (const unsigned int vertex_no : GeometryInfo<2>::vertex_indices())
         {
           for (unsigned int i = 0; i < 2; ++i)
-            m[i].add_line(cell->vertex_dof_index(vertex_no, 0));
+            if (m[i].is_constrained(cell->vertex_dof_index(vertex_no, 0)) ==
+                false)
+              m[i].constrain_dof_to_zero(cell->vertex_dof_index(vertex_no, 0));
         }
 
       if (cell->at_boundary())
@@ -174,7 +176,7 @@ curved_grid(std::ostream &out)
                 if (std::fabs(face->vertex(1).norm() - r_i) < eps)
                   for (unsigned int i = 0; i < 2; ++i)
                     {
-                      m[i].add_line(face->dof_index(0));
+                      m[i].constrain_dof_to_zero(face->dof_index(0));
                       m[i].set_inhomogeneity(face->dof_index(0),
                                              (face->center() *
                                               (r_i / face->center().norm() -
@@ -182,7 +184,7 @@ curved_grid(std::ostream &out)
                     }
                 else if (std::fabs(face->vertex(1).norm() - r_a) < eps)
                   for (unsigned int i = 0; i < 2; ++i)
-                    m[i].add_line(face->dof_index(0));
+                    m[i].constrain_dof_to_zero(face->dof_index(0));
                 else
                   Assert(false, ExcInternalError());
               }
index 3e38a6bdfc8377de8ffbc8038a185a744f9b152f..afdd3e9d464e32af33450095d376e20a46458434 100644 (file)
@@ -426,7 +426,10 @@ namespace Step36
                       // if
                       // (fe_collection[1].face_system_to_component_index(i).first
                       // /*component*/ > 0)
-                      constraints.add_line(local_face_dof_indices[i]);
+                      if (constraints.is_constrained(
+                            local_face_dof_indices[i]) == false)
+                        constraints.constrain_dof_to_zero(
+                          local_face_dof_indices[i]);
                 }
             }
   }
index d30005210e6e1afe628905d2727ae64ba0f1b9ba..c1988337837900098c493da884f6f68de9a34aba 100644 (file)
@@ -690,7 +690,7 @@ MeshWorkerAffineConstraintsTest<dim>::createInhomConstraints()
 
           if (std::sqrt(p.square()) < 1e-6)
             {
-              this->constraintsInhom.add_line(dof_index);
+              this->constraintsInhom.constrain_dof_to_zero(dof_index);
               this->constraintsInhom.set_inhomogeneity(dof_index, 2);
             }
         }
index 36de05c412eecb9c9df6c5ef9bcf95c253e647da..2d93ee55932c3e6c0c5bba5ac970532dc4fbe2b7 100644 (file)
@@ -40,8 +40,8 @@ test()
   local_active.add_range(myid * numproc, (myid + 1) * numproc);
 
   AffineConstraints<double> cm;
-  cm.add_line(1);
-  cm.add_line(2);
+  cm.constrain_dof_to_zero(1);
+  cm.constrain_dof_to_zero(2);
   cm.close();
 
   deallog << "CM:" << std::endl;
index e5cd47114bf3d11d6f807e6cdd363b24072f8d15..f5ebb194a44baafed2d38fa8e7c13bad60a6ecb4 100644 (file)
@@ -39,7 +39,7 @@ main()
 
   // set up constraint
   AffineConstraints<double> constraints;
-  constraints.add_line(0);
+  constraints.constrain_dof_to_zero(0);
   constraints.close();
 
   // global matrix and vector
index f1f0f91752fa92a491aad81c2f7aca4ce70afdea..4e01699a0dc25d7a61eb4750acb8fa39b2b5b10c 100644 (file)
@@ -42,7 +42,7 @@ test()
   for (unsigned int i = 0; i < sizeof(inhoms) / sizeof(inhoms[0]); ++i)
     {
       deallog << inhoms[i] << std::endl;
-      cm.add_line(inhoms[i]);
+      cm.constrain_dof_to_zero(inhoms[i]);
       cm.set_inhomogeneity(inhoms[i], 1.0);
     }
 
index b7e884e45a5b05ac48f7e05de85433232d23a316..10717c5eb7d594dbbe135042400d5016618f0ac6 100644 (file)
@@ -86,7 +86,7 @@ test()
       {
         if (!correct_constraints.is_constrained(boundary_value->first))
           {
-            correct_constraints.add_line(boundary_value->first);
+            correct_constraints.constrain_dof_to_zero(boundary_value->first);
             correct_constraints.set_inhomogeneity(boundary_value->first,
                                                   boundary_value->second);
           }
index fc0fcc33a06b80292f5989e9a678794e8107a863..c1b82110250aeb87a01d198d325b6dda48eec6d7 100644 (file)
@@ -75,7 +75,8 @@ test(const DoFHandler<dim, spacedim> &dof_handler,
         {
           cell->face(face)->get_dof_indices(dof_indices);
           for (const auto i : dof_indices)
-            constraints.add_line(i);
+            if (constraints.is_constrained(i) == false)
+              constraints.constrain_dof_to_zero(i);
         }
 
   const auto a = collect_lines(constraints, dof_handler.n_dofs());
index 566acc2629e89360c28d9b09909fb3db9e729c0c..b5f76aed41179b36a11e2bbbc7206053fe945916 100644 (file)
@@ -41,11 +41,11 @@ merge_check()
   AffineConstraints<double> c1(local_lines), c2(local_lines);
   for (types::global_dof_index i = 99999800; i < local_lines.size(); ++i)
     if (i % 2 == 1)
-      c1.add_line(i);
+      c1.constrain_dof_to_zero(i);
 
-  c2.add_line(99999800);
-  c2.add_line(99999801);
-  c2.add_line(99999802);
+  c2.constrain_dof_to_zero(99999800);
+  c2.constrain_dof_to_zero(99999801);
+  c2.constrain_dof_to_zero(99999802);
 
   // now merge the two and print the results
   c2.merge(c1, AffineConstraints<double>::right_object_wins);
index 8ff9f44cf22a0c46a18a16c72303cdf6d987f96a..5407364785b61e6899f57c0ad51c364559355b4e 100644 (file)
@@ -30,7 +30,7 @@ main()
   double                    vals[] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
   for (unsigned int i = 0; i < sizeof(IDs) / sizeof(IDs[0]); ++i)
     {
-      constraints.add_line(IDs[i]);
+      constraints.constrain_dof_to_zero(IDs[i]);
       constraints.set_inhomogeneity(IDs[i], vals[i]);
     }
 
index 40a04710f9b4d48944f665fb9273e0dee5a044a0..bc8eac13fd6cbedcf2cedcca727e44df603023a5 100644 (file)
@@ -36,7 +36,7 @@ test()
   AffineConstraints<double> cm;
 
   for (unsigned int i = 0; i < 5; ++i)
-    cm.add_line(i);
+    cm.constrain_dof_to_zero(i);
   cm.close();
 
   // completely fill a 5x5 matrix
index 707287aa078dc032ea8440c91c32e0eb596e1066..4ec50667f05f38d839d4cef461408b0403380cc0 100644 (file)
@@ -226,7 +226,7 @@ LaplaceProblem<dim>::setup_system()
       {
         if (!test_all_constraints.is_constrained(boundary_value->first))
           {
-            test_all_constraints.add_line(boundary_value->first);
+            test_all_constraints.constrain_dof_to_zero(boundary_value->first);
             test_all_constraints.set_inhomogeneity(boundary_value->first,
                                                    boundary_value->second);
           }
index 34810107d7446f2576bbd3d48bc291b14c587302..968ff0332e20984766ea9ee1d3ad1e276a532401 100644 (file)
@@ -90,11 +90,11 @@ test(bool use_constraint_matrix)
     {
       AffineConstraints<double> cm;
 
-      cm.add_line(1);
+      cm.constrain_dof_to_zero(1);
       cm.set_inhomogeneity(1, -5.0);
-      cm.add_line(3);
+      cm.constrain_dof_to_zero(3);
       cm.set_inhomogeneity(3, 2.0);
-      cm.add_line(4);
+      cm.constrain_dof_to_zero(4);
       cm.set_inhomogeneity(4, 0.0);
 
       cm.close();
index aac704daad557a0b5402f9e3de05da4c85e624d8..77326d010aae997bd7f359cb7067420f4a05fbb9 100644 (file)
@@ -148,7 +148,7 @@ AdvectionProblem<dim>::setup_system()
       boundary_values.begin();
     for (; boundary_value != boundary_values.end(); ++boundary_value)
       {
-        test_all_constraints.add_line(boundary_value->first);
+        test_all_constraints.constrain_dof_to_zero(boundary_value->first);
         test_all_constraints.set_inhomogeneity(boundary_value->first,
                                                boundary_value->second);
       }
index a955ae518e08cb6432431fb989b91764cbfefd41..b3591af895f115026d28b0a6506515e888b154eb 100644 (file)
@@ -153,7 +153,7 @@ AdvectionProblem<dim>::setup_system()
       boundary_values.begin();
     for (; boundary_value != boundary_values.end(); ++boundary_value)
       {
-        test_all_constraints.add_line(boundary_value->first);
+        test_all_constraints.constrain_dof_to_zero(boundary_value->first);
         test_all_constraints.set_inhomogeneity(boundary_value->first,
                                                boundary_value->second);
       }
index 431eef17f70b26f71dbf75691a788383a4ae5de4..71e2985af5eaa06c72ada4e546990f1e41089205 100644 (file)
@@ -104,7 +104,7 @@ test()
       std::set<types::global_dof_index>::iterator bc_it =
         boundary_indices[level].begin();
       for (; bc_it != boundary_indices[level].end(); ++bc_it)
-        mg_constraints[level].add_line(*bc_it);
+        mg_constraints[level].constrain_dof_to_zero(*bc_it);
       mg_constraints[level].close();
       typename MatrixFree<dim>::AdditionalData data;
       data.mg_level = level;
index 2c22ac71c2605d9864c1e126e84eae4abb26a71f..c76ed85c7e0b5d32c6004838d55ccb7eab4b5463 100644 (file)
@@ -109,7 +109,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index 24add073bca0419c5eeea5cad332645c23315bd4..b671e09cffe3d1aeca6f1c2818dd4f57b653a498 100644 (file)
@@ -114,7 +114,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index 769bffcc8798186e2099acc69997f9fa7fe4e4fa..8bd6eae736fee9ea049048833d7ee5bcbcde914a 100644 (file)
@@ -120,7 +120,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index 34f4b988042424f033e3ca1f056aa01c89fab179..bad965578b68bf939b8cb702f9571a9088126a61 100644 (file)
@@ -121,7 +121,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
@@ -161,7 +162,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index 3cecbcc9fcb39bfdd952738c8c26d5c9034bbd3f..a57870dfa58d3834a039bdf294d248ac9d0cbb54 100644 (file)
@@ -109,7 +109,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index 6367d2e9ce117657092df89cc96c97f7f07a58d7..96309833332a547aae9ea7118e02f25a42b03c05 100644 (file)
@@ -448,7 +448,7 @@ namespace Step37
         std::set<types::global_dof_index>::iterator bc_it =
           boundary_indices[level].begin();
         for (; bc_it != boundary_indices[level].end(); ++bc_it)
-          mg_constraints[level].add_line(*bc_it);
+          mg_constraints[level].constrain_dof_to_zero(*bc_it);
 
         mg_constraints[level].close();
         mg_matrices[level].reinit(dof_handler, mg_constraints[level], level);
index 8c5f47e42c333e2e13481923fae18704e0b556d8..58f553672ea212b6a7525e1d24476323ffbebab3 100644 (file)
@@ -59,7 +59,7 @@ test()
   local_active_together.add_range(numproc + myid * 2, numproc + myid * 2 + 2);
 
   AffineConstraints<PetscScalar> cm(local_active_together);
-  cm.add_line(numproc + myid * 2);
+  cm.constrain_dof_to_zero(numproc + myid * 2);
   cm.close();
 
   deallog << "vector before:" << std::endl;
index a11cc922316978ad113a71f8e11699df6e0a3a1d..6d011d934a3285f8905f6025bb95e30cba17cbd9 100644 (file)
@@ -63,7 +63,7 @@ test()
   local_active_together.add_range(numproc + myid * 2, numproc + myid * 2 + 2);
 
   AffineConstraints<double> cm(local_active_together);
-  cm.add_line(numproc + myid * 2);
+  cm.constrain_dof_to_zero(numproc + myid * 2);
   cm.close();
 
   deallog << "vector before:" << std::endl;
index 331eaff85bfaeeee74a4e7ac87bf23b46b5844ca..641ed956474f03aa3a36b1bb69a4febe79f8f889 100644 (file)
@@ -40,7 +40,7 @@ test()
   // local_active_together.compress();
 
   AffineConstraints<double> cm(local_active_together);
-  cm.add_line(1);
+  cm.constrain_dof_to_zero(1);
   cm.close();
   deallog << "OK" << std::endl;
 }
index 69be471812776a054e03b784898f73e3c662ec42..c0c05a960a169008a9ed67d15194ec6513ff6b33 100644 (file)
@@ -47,7 +47,7 @@ test()
 
 
   AffineConstraints<double> cm(owned, relevant);
-  cm.add_line(0);
+  cm.constrain_dof_to_zero(0);
   cm.close();
 
   AffineConstraints<double> cm2;
index f4d14c399031126df9580627d72f5356d7fd1d7c..7b4ac1e2a5837d00c5a8f99bf2d952742933efc8 100644 (file)
@@ -41,7 +41,7 @@ test()
 
 
   AffineConstraints<double> cm(owned, relevant);
-  cm.add_line(0);
+  cm.constrain_dof_to_zero(0);
   cm.close();
 
   AffineConstraints<double> cm2(cm);
index 76ad1f756c6da2b6b985f666610ad36a9f05a497..f70d3f396e8257aa29ddc03bc8550bf7474b6d49 100644 (file)
@@ -22,7 +22,7 @@
 905: An error occurred in line <1898> of file
 </scratch/deal-trunk/deal.II/include/deal.II/lac/affine_constraints.h> in
 function 905:     void
-dealii::AffineConstraints<double>::add_line(dealii::AffineConstraints<double>::size_type)
+dealii::AffineConstraints<double>::constrain_dof_to_zero(dealii::AffineConstraints<double>::size_type)
 905: The violated condition was: 905:     line != numbers::invalid_size_type
 905: The name and call sequence of the exception was: 905: ExcInternalError()
 905: Additional Information: 905: (none) 905:
index aca0dc688a04a36052f2ef41d3050598eb4e7cfb..185b746cfc52e8a3fdefe610d42f5d8f1812412f 100644 (file)
@@ -109,7 +109,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index e39bca030d628dbeccfbbfeb91e06552e7f19929..4ae6381bfd9e41c1e20a42caf1fb4dc4d49a0888 100644 (file)
@@ -114,7 +114,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index debcb77147b9f4e06def3cf3e2be9ddfcc6e1292..6a598fd04c4f72d2d74860bf1a8a45462450e71b 100644 (file)
@@ -120,7 +120,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index 05db905214f74ec8d60aa34c2bee8c1ab766b138..1a02458326259b6e73174c09bebd08cfcb1c73d9 100644 (file)
@@ -121,7 +121,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
@@ -161,7 +162,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index 49e38c344a1dbe72b464199a1cbf6b0d2b61ebdf..41bd2928dc958e9debd16e4e7e1efc491b3848d1 100644 (file)
@@ -109,7 +109,8 @@ public:
                     {
                       face->get_mg_dof_indices(level, local_dofs);
                       for (unsigned int i = 0; i < fe.dofs_per_face; ++i)
-                        constraints.add_line(local_dofs[i]);
+                        if (constraints.is_constrained(local_dofs[i]) == false)
+                          constraints.constrain_dof_to_zero(local_dofs[i]);
                     }
                 }
           }
index 4da2a04d811ee9bd159feebb9617a405ff792b74..e6aa5afc55c69d6347ee5bb7f808158a4d7d3840 100644 (file)
@@ -64,7 +64,7 @@ check()
         {
           if (level_constraints.can_store_line(face_dofs[i]))
             {
-              level_constraints.add_line(face_dofs[i]);
+              level_constraints.constrain_dof_to_zero(face_dofs[i]);
               level_constraints.set_inhomogeneity(face_dofs[i], 5.0);
             }
         }
index 38c1c1369e24840d607791f3b726672d9f23b960..197fa2106b83d7974b8a97193a64f6e3172984fe 100644 (file)
@@ -62,7 +62,7 @@ check()
     {
       if (user_constraints.can_store_line(face_dofs[i]))
         {
-          user_constraints.add_line(face_dofs[i]);
+          user_constraints.constrain_dof_to_zero(face_dofs[i]);
           user_constraints.set_inhomogeneity(face_dofs[i], 5.0);
         }
     }
index 64123fbc11ed44c25965fa45667d1d0f048264be..7a0239ef6f880b3b4d848049acac1fe2af0d61b0 100644 (file)
@@ -59,7 +59,7 @@ check()
     {
       if (user_constraints.can_store_line(face_dofs[i]))
         {
-          user_constraints.add_line(face_dofs[i]);
+          user_constraints.constrain_dof_to_zero(face_dofs[i]);
           user_constraints.set_inhomogeneity(face_dofs[i], 5.0);
         }
     }
index 2328401dd43ce14afda45c54ab56b1e0bd2b1e01..f6934fb5053589a71016227403c2f19f9a10bd7e 100644 (file)
@@ -193,9 +193,9 @@ public:
           if (global_ids[i] == numbers::invalid_size_type)
             continue;
 
-          constraints.add_line(global_ids[i]);
-          constraints.set_inhomogeneity(global_ids[i],
-                                        evaluation_point_results[i]);
+          constraints.add_constraint(global_ids[i],
+                                     {},
+                                     evaluation_point_results[i]);
         }
     }
     constraints.close();

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.