<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v3.0 20080202//EN" "http://dtd.nlm.nih.gov/publishing/3.0/journalpublishing3.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="3.0" xml:lang="en" article-type="research article">
 <front>
  <journal-meta>
   <journal-id journal-id-type="publisher-id">
    jsea
   </journal-id>
   <journal-title-group>
    <journal-title>
     Journal of Software Engineering and Applications
    </journal-title>
   </journal-title-group>
   <issn pub-type="epub">
    1945-3116
   </issn>
   <issn publication-format="print">
    1945-3124
   </issn>
   <publisher>
    <publisher-name>
     Scientific Research Publishing
    </publisher-name>
   </publisher>
  </journal-meta>
  <article-meta>
   <article-id pub-id-type="doi">
    10.4236/jsea.2025.183008
   </article-id>
   <article-id pub-id-type="publisher-id">
    jsea-141591
   </article-id>
   <article-categories>
    <subj-group subj-group-type="heading">
     <subject>
      Articles
     </subject>
    </subj-group>
    <subj-group subj-group-type="Discipline-v2">
     <subject>
      Computer Science 
     </subject>
     <subject>
       Communications
     </subject>
    </subj-group>
   </article-categories>
   <title-group>
    Software Architecture Evaluation of Earth System Models
   </title-group>
   <contrib-group>
    <contrib contrib-type="author" xlink:type="simple">
     <name name-style="western">
      <surname>
       Wilhelm
      </surname>
      <given-names>
       Hasselbring
      </given-names>
     </name>
    </contrib>
    <contrib contrib-type="author" xlink:type="simple">
     <name name-style="western">
      <surname>
       Reiner
      </surname>
      <given-names>
       Jung
      </given-names>
     </name>
    </contrib>
    <contrib contrib-type="author" xlink:type="simple">
     <name name-style="western">
      <surname>
       Henning
      </surname>
      <given-names>
       Schnoor
      </given-names>
     </name>
    </contrib>
   </contrib-group> 
   <aff id="affnull">
    <addr-line>
     aDepartment of Computer Science, Kiel University, Kiel, Germany
    </addr-line> 
   </aff> 
   <pub-date pub-type="epub">
    <day>
     20
    </day> 
    <month>
     03
    </month>
    <year>
     2025
    </year>
   </pub-date> 
   <volume>
    18
   </volume> 
   <issue>
    03
   </issue>
   <fpage>
    113
   </fpage>
   <lpage>
    138
   </lpage>
   <history>
    <date date-type="received">
     <day>
      4,
     </day>
     <month>
      March
     </month>
     <year>
      2025
     </year>
    </date>
    <date date-type="published">
     <day>
      24,
     </day>
     <month>
      March
     </month>
     <year>
      2025
     </year> 
    </date> 
    <date date-type="accepted">
     <day>
      24,
     </day>
     <month>
      March
     </month>
     <year>
      2025
     </year> 
    </date>
   </history>
   <permissions>
    <copyright-statement>
     © Copyright 2014 by authors and Scientific Research Publishing Inc. 
    </copyright-statement>
    <copyright-year>
     2014
    </copyright-year>
    <license>
     <license-p>
      This work is licensed under the Creative Commons Attribution International License (CC BY). http://creativecommons.org/licenses/by/4.0/
     </license-p>
    </license>
   </permissions>
   <abstract>
    Earth System Models (ESMs) play a vital role in understanding and assessing climate change and other earth system-related issues. They are complex and long-living software systems, mainly programmed in Fortran, that undergo changes as science progresses. They have a myriad of variants that must be maintained to support reproducing experiment results. In a research context, often with contributions from scientists on non-tenured contracts and without a formal software engineering education, this can lead to architecture erosion, hampering further development and, therefore, scientific progress. Furthermore, it harms code comprehension, introducing risks for the quality of the earth system models. To address these challenges, our goal is to design and study methods for improving the maintainability of ESMs implemented in Fortran. In this paper, we assess two widely used earth system models—namely UVic and MITgcm—combining dynamic software profiling with static code analysis for reverse engineering. We introduce a new approach to module interface discovery in Fortran systems. We provide a detailed analysis of the ESMs’ architectures and report quantitative properties.
   </abstract>
   <kwd-group> 
    <kwd>
     Earth System Models
    </kwd> 
    <kwd>
      Software Architecture
    </kwd> 
    <kwd>
      Dynamic Analysis
    </kwd> 
    <kwd>
      Static Analysis
    </kwd> 
    <kwd>
      Architecture Evaluation
    </kwd>
   </kwd-group>
  </article-meta>
 </front>
 <body>
  <sec id="s1">
   <title>1. Introduction</title>
   <p>Earth System Models (ESMs) are complex software systems used to simulate the Earth’s climate and understand its effects on, e.g., oceans, agriculture, and habitats. They comprise different sub-models addressing specific aspects of the earth system, such as ocean circulation. Their code is partly decades old. Such scientific models can start as small software systems, which evolve into large, complex models or are integrated into other models. Software engineering for computational science has specific characteristics <xref ref-type="bibr" rid="scirp.141591-1">
     [1]
    </xref> and involves dedicated roles such as model developers and research software engineers <xref ref-type="bibr" rid="scirp.141591-2">
     [2]
    </xref>.</p>
   <p>The ESMs are continually modified and enhanced to provide new insights for specific research questions. This leads to numerous variants and versions for an ESM, which must be maintained as other scientists intend to base their research on new features and reproduce results. Thus, ESMs are long-living software <xref ref-type="bibr" rid="scirp.141591-3">
     [3]
    </xref> and face typical risks, e.g., blurring module boundaries and architectural erosion, due to changes in functionality, hardware, and language features. The resulting architectural debts can limit further research and may harm the validity of scientific results. Furthermore, the lack of documentation and the loss of knowledge as scientists move to other positions limit the maintainability of ESMs. Therefore, the long-term development of ESMs faces unique challenges. Our goal is to support the model developers and research software engineers in program comprehension and to aid architectural decisions.</p>
   <p>A note on the term ‘model’ in climate science: In software engineering and information systems research, modeling is also an essential activity. Conversely to climate science, where climate models are the software systems to simulate the Earth, in software engineering and in information systems research, models are built as abstractions of the software systems themselves. A software architecture description is an example of such a model in software engineering <xref ref-type="bibr" rid="scirp.141591-4">
     [4]
    </xref>, not to be confused with a (software) model of the Earth.</p>
   <p>To ensure the maintainability of ESMs, an understanding of the software architecture is necessary. Documentation is usually rare in this domain. In particular, architecture documentation is, if it exists at all, often outdated and incomplete. Thus, rediscovering the architecture of ESMs is a key step to ensure their longevity, as it allows for guiding architectural improvements and identifying areas that should be restructured. Architectural analyses provide an overview of the ESM’s structure and dependencies. They allow identifying interfaces that support developers in extending a model or adding alternative sub-models to an ESM. In addition, they help new scientists understand the implementation of the model. Furthermore, based on structural optimizations, developers can improve the architecture over time to facilitate future developments.</p>
   <p>Our goal is to support program comprehension and to evaluate how software engineering tools and methods can assist in analyzing and improving the architecture of ESMs.</p>
   <p>As contributions of this paper, we provide:</p>
   <p>We chose UVic and MITgcm for our analysis, as they are used in many research projects, such as SOLAS <xref ref-type="bibr" rid="scirp.141591-7">
     [7]
    </xref>, PalMod <xref ref-type="bibr" rid="scirp.141591-8">
     [8]
    </xref> <xref ref-type="bibr" rid="scirp.141591-9">
     [9]
    </xref>, CMIP6 <xref ref-type="bibr" rid="scirp.141591-10">
     [10]
    </xref>, and the IPCC report <xref ref-type="bibr" rid="scirp.141591-11">
     [11]
    </xref>. Both ESMs are implemented in Fortran and run on Unix workstations without specific hardware requirements, and we collaborate with domain experts working with both models as research software engineers. MITgcm is referred to by the domain experts collaborating with us as a good example of a modern ESM, while UVic is a representative of a more traditionally developed ESM whose development began in the 1960s.</p>
   <p>We describe our reverse engineering method in Section 2, followed by presenting the results of applying this method to our two case study ESMs in Section 3 (for UVic) and Section 4 (for MITgcm). We evaluate the results in Section 5 and present related work in Section 6 before we conclude the paper in Section 7.</p>
   <p>Replication and Data Packages We provide a replication package for our reverse engineering results <xref ref-type="bibr" rid="scirp.141591-12">
     [12]
    </xref>. This package contains detailed instructions on (a) how to replicate our evaluation, (b) the exact setup used for the dynamic analysis, (c) all scripts and the programs used to perform the static analysis, and (d) our analysis and logging tools. A Docker file allows running the analyses without manually installing the required software.</p>
  </sec><sec id="s2">
   <title>2. Our Reverse Engineering Method</title>
   <p>We employ several methods and techniques to analyze and evaluate software architectures of Fortran-based ESMs. Our analysis process, depicted in <xref ref-type="fig" rid="fig1">
     Figure 1
    </xref>, consists of eight tasks that allow us to recover an architecture model from static and</p>
   <fig id="fig1" position="float">
    <label>Figure 1</label>
    <caption>
     <title>Figure 1. Our analysis process. First, we recover the architecture via reverse engineering with dynamic and static analysis. Then, we combine the results of dynamic and static analysis, interface discovery, and architecture evaluation.</title>
    </caption>
    <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId18.jpeg?20250327094001" />
   </fig>
   <p>dynamic information of a running scientific model. In addition to methods for collecting execution traces at runtime and for measuring metrics-based software quality (Section 2.1), we include dataflow analysis (Section 2.3) and interface recovery (Section 2.2) to enrich the recovered architectures.</p>
   <sec id="s2_1">
    <title>2.1. Dynamic and Static Analysis</title>
    <p>For reverse engineering, we use both dynamic and static analysis techniques to gain detailed insights into the software:</p>
    <p>Dynamic Analysis: The upper-left pipeline part in <xref ref-type="fig" rid="fig1">
      Figure 1
     </xref> shows that we instrument the Fortran code with monitoring probes. We execute the ESMs utilizing configurations derived from climate science publications provided by our domain experts. The dynamic analysis observes the software at runtime and collects monitoring information about procedure calls. This approach detects which parts of software are actually used and how they behave. To instrument the ESM, we employ the monitoring framework Kieker <xref ref-type="bibr" rid="scirp.141591-13">
      [13]
     </xref> <xref ref-type="bibr" rid="scirp.141591-14">
      [14]
     </xref> in combination with the ability of the GNU Compiler Collection and Intel Fortran compilers to instrument functions utilizing the -finstrument-functions option.<sup>1</sup> Our dynamic architecture recovery tool dar<sup>2</sup>, then recovers the architecture from the monitoring data.</p>
    <p>Static Analysis: The lower-left pipeline part in <xref ref-type="fig" rid="fig1">
      Figure 1
     </xref> shows that to perform the static analysis on Fortran code, we first pre-process the source code. To discover calls, dataflows, and accesses to common blocks from Fortran source code, we developed our fxca<sup>3</sup> tool to produce lists of procedure calls, procedure name-to-file mappings, access to common blocks, and dataflows between procedures for the static architecture recovery tool sar<sup>4</sup>, which generates the statically recovered architecture model. fxca is an extension of fxtran<sup>5</sup>, which provides a concrete syntax tree of Fortran code.</p>
    <p>While both dynamic and static analyses usually recover similar architectures, each one can identify certain aspects better than the other. The static analysis can identify common blocks in Fortran, while the dynamic analysis can collect information on procedures used from libraries, which the static analysis cannot provide with the same detail.</p>
    <p>To take advantage of both analysis techniques, we then (optionally) merge the results of the static and dynamic analyses into a combined architecture model and discover module interfaces (right part of <xref ref-type="fig" rid="fig1">
      Figure 1
     </xref>).</p>
   </sec>
   <sec id="s2_2">
    <title>2.2. Dataflow Analysis</title>
    <p>In addition to control flow (i.e., the study of which operations are called from which points in the code), we also study dataflow, i.e., the question of which parts of the code communicate by accessing the same data. In Fortran, the default way of handling parameters in procedures is call-by-reference. This is used to pass data into subroutines and get results back. This has a significant impact on the dataflow analysis and the complexity of a system. In case a subroutine modifies call-by-reference parameters, a developer must keep side effects in mind when changing the program, while call-by-value operations have no side effects. A Fortran function is similar to a mathematical function, which takes parameter values as inputs and returns a single output value. A Fortran subroutine is a block of code that performs some operation on the input variables, and as a result of calling the subroutine, the input variables are modified (call-by-reference).<sup>6</sup> When a distinction between functions and subroutines is not required for our analysis, we will use the term operation.</p>
    <p>Since the question of whether data flows from one procedure to another via any means of communication (e.g., writing/reading the same file or memory location using array indexing or pointer arithmetic) is, in general, undecidable, we focus on dataflow using global variables which in Fortran are expressed as common blocks <xref ref-type="bibr" rid="scirp.141591-15">
      [15]
     </xref> and procedure calls. Procedure calls can have call-by-value and call-be reference parameters. Call by value is interpreted as a dataflow from the caller to the callee. For call-by reference, we check whether the reference is used for read or write operations within the procedure. In case only read operations are used, the dataflow is from the caller to the callee. Write operations result in a dataflow from the callee to the caller. In case both operations are used, the architecture model contains a bidirectional dataflow edge, and the analysis graphs provide two edges for each direction. In case there are multiple dataflows between two procedures, they are merged following the same principle as with calls for two reasons:</p>
    <p>1) Developers have to consider the dependency between both procedures regardless of the number of parameters.</p>
    <p>2) Parameters can have basic or composed data types.</p>
    <p>Compound data types can be replaced by a set of parameters with basic types. Common blocks are seen as one single “piece of data,” and we do not distinguish between access to different variables in the same block. The reason for this decision is that we assume that the common block is usually seen as a single entity by the developers of the ESM, and therefore, two procedures that access the same common block are conceptually coupled. Our analysis scripts could also be used to analyze a more fine-grained view of the distinction between variables in the same block.</p>
   </sec>
   <sec id="s2_3">
    <title>2.3. Interface Discovery</title>
    <p>Fortran 77 does not provide syntactical structures that describe interfaces to modules, and even code conforming to Fortran 90 and above does not use this language feature in the two ESMs we analyzed. Thus, the recovered architecture, as initially obtained with Kieker, does not contain interfaces. To support the understanding of the architecture and the code, our second step infers interfaces based on cross-module calls.</p>
    <p>Interfaces help developers understand which (public) operations are used by other modules and which (private) operations represent module-internal functionality. Well-designed interfaces group operations together that address a specific concern, e.g., writing and modifying files.</p>
    <p>Therefore, we discover interfaces based on calls crossing module boundaries, i.e., calls that originate in one module and call operations in another module. Solely based on these inter-module calls, it is possible to generate candidates for interfaces in four different ways:</p>
    <p>1) One large interface for each module pair, resulting in multiple interfaces for one module that may contain the same or similar sets of operations.</p>
    <p>2) One interface for all exposed, i.e., externally called operations, per module, resulting in multiple other modules requiring the same interface. These interfaces can become very large and mingle many concerns together.</p>
    <p>3) One interface per exposed operation, resulting in many interfaces, making it hard to group associated operations together.</p>
    <p>4) Grouping operations together that have the same set of callers. This may still lead to numerous interfaces, but if developers follow a pattern when using operations, this approach will reduce the number of interfaces in contrast to Option 3.</p>
    <p>For this paper, we applied Option 4 and implemented four steps to compute interfaces for an architecture description.</p>
    <p>For the formal description of our interface discovery process, we use 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>
        O 
      </mi> 
     </math> as the set of all operations in the ESM. The modules of the software are denoted 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mn>
          1 
        </mn> 
       </msub> 
      </mrow> 
     </math> to 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          n 
        </mi> 
       </msub> 
      </mrow> 
     </math>. These modules constitute a partition of 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>
        O 
      </mi> 
     </math>, i.e., 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         O 
       </mi> 
       <mo>
         = 
       </mo> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mn>
          1 
        </mn> 
       </msub> 
       <mo>
         ∪ 
       </mo> 
       <mo>
         … 
       </mo> 
       <mo>
         ∪ 
       </mo> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          n 
        </mi> 
       </msub> 
      </mrow> 
     </math> and 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          i 
        </mi> 
       </msub> 
       <mo>
         ∩ 
       </mo> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          j 
        </mi> 
       </msub> 
       <mo>
         = 
       </mo> 
       <mo>
         ∅ 
       </mo> 
      </mrow> 
     </math> for 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         i 
       </mi> 
       <mo>
         ≠ 
       </mo> 
       <mi>
         j 
       </mi> 
      </mrow> 
     </math>. The function 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         m 
       </mi> 
       <mi>
         o 
       </mi> 
       <mi>
         d 
       </mi> 
       <mi>
         u 
       </mi> 
       <mi>
         l 
       </mi> 
       <mi>
         e 
       </mi> 
      </mrow> 
     </math> returns the corresponding module 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>
        o 
      </mi> 
     </math> for any given operation and is defined as:</p>
    <p>
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         m 
       </mi> 
       <mi>
         o 
       </mi> 
       <mi>
         d 
       </mi> 
       <mi>
         u 
       </mi> 
       <mi>
         l 
       </mi> 
       <mi>
         e 
       </mi> 
       <mrow> 
        <mo>
          ( 
        </mo> 
        <mi>
          o 
        </mi> 
        <mo>
          ) 
        </mo> 
       </mrow> 
       <mo>
         = 
       </mo> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          i 
        </mi> 
       </msub> 
       <mtext>
           
       </mtext> 
       <mtext>
           
       </mtext> 
       <mtext>
         with 
       </mtext> 
       <mtext>
           
       </mtext> 
       <mtext>
           
       </mtext> 
       <mi>
         o 
       </mi> 
       <mo>
         ∈ 
       </mo> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          i 
        </mi> 
       </msub> 
      </mrow> 
     </math></p>
    <p>All calls between operations in the architecture model are represented by 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          E 
        </mi> 
        <mrow> 
         <mi>
           a 
         </mi> 
         <mi>
           l 
         </mi> 
         <mi>
           l 
         </mi> 
        </mrow> 
       </msub> 
       <mo>
         ⊆ 
       </mo> 
       <mi>
         O 
       </mi> 
       <mo>
         × 
       </mo> 
       <mi>
         O 
       </mi> 
      </mrow> 
     </math>.</p>
    <p>Step One: The first step creates a subset 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          E 
        </mi> 
        <mrow> 
         <mi>
           s 
         </mi> 
         <mi>
           u 
         </mi> 
         <mi>
           b 
         </mi> 
        </mrow> 
       </msub> 
      </mrow> 
     </math> of all distinct calls 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          E 
        </mi> 
        <mrow> 
         <mi>
           a 
         </mi> 
         <mi>
           l 
         </mi> 
         <mi>
           l 
         </mi> 
        </mrow> 
       </msub> 
      </mrow> 
     </math> in the execution model where the caller 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          o 
        </mi> 
        <mi>
          r 
        </mi> 
       </msub> 
      </mrow> 
     </math> and callee 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          o 
        </mi> 
        <mi>
          p 
        </mi> 
       </msub> 
      </mrow> 
     </math> of a call are not in the same module:</p>
    <p>
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          E 
        </mi> 
        <mrow> 
         <mi>
           s 
         </mi> 
         <mi>
           u 
         </mi> 
         <mi>
           b 
         </mi> 
        </mrow> 
       </msub> 
       <mo>
         = 
       </mo> 
       <mrow> 
        <mo>
          { 
        </mo> 
        <mrow> 
         <mrow> 
          <mo>
            ( 
          </mo> 
          <mrow> 
           <msub> 
            <mi>
              o 
            </mi> 
            <mi>
              r 
            </mi> 
           </msub> 
           <mo>
             , 
           </mo> 
           <msub> 
            <mi>
              o 
            </mi> 
            <mi>
              p 
            </mi> 
           </msub> 
          </mrow> 
          <mo>
            ) 
          </mo> 
         </mrow> 
         <mo>
           | 
         </mo> 
         <mrow> 
          <mo>
            ( 
          </mo> 
          <mrow> 
           <msub> 
            <mi>
              o 
            </mi> 
            <mi>
              r 
            </mi> 
           </msub> 
           <mo>
             , 
           </mo> 
           <msub> 
            <mi>
              o 
            </mi> 
            <mi>
              p 
            </mi> 
           </msub> 
          </mrow> 
          <mo>
            ) 
          </mo> 
         </mrow> 
         <mo>
           ∈ 
         </mo> 
         <msub> 
          <mi>
            E 
          </mi> 
          <mrow> 
           <mi>
             a 
           </mi> 
           <mi>
             l 
           </mi> 
           <mi>
             l 
           </mi> 
          </mrow> 
         </msub> 
         <mo>
           ∧ 
         </mo> 
         <mi>
           m 
         </mi> 
         <mi>
           o 
         </mi> 
         <mi>
           d 
         </mi> 
         <mi>
           u 
         </mi> 
         <mi>
           l 
         </mi> 
         <mi>
           e 
         </mi> 
         <mrow> 
          <mo>
            ( 
          </mo> 
          <mrow> 
           <msub> 
            <mi>
              o 
            </mi> 
            <mi>
              r 
            </mi> 
           </msub> 
          </mrow> 
          <mo>
            ) 
          </mo> 
         </mrow> 
         <mo>
           ≠ 
         </mo> 
         <mi>
           m 
         </mi> 
         <mi>
           o 
         </mi> 
         <mi>
           d 
         </mi> 
         <mi>
           u 
         </mi> 
         <mi>
           l 
         </mi> 
         <mi>
           e 
         </mi> 
         <mrow> 
          <mo>
            ( 
          </mo> 
          <mrow> 
           <msub> 
            <mi>
              o 
            </mi> 
            <mi>
              p 
            </mi> 
           </msub> 
          </mrow> 
          <mo>
            ) 
          </mo> 
         </mrow> 
        </mrow> 
        <mo>
          } 
        </mo> 
       </mrow> 
      </mrow> 
     </math></p>
    <p>Step Two: In this step, we identify all provided operations of one module 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          j 
        </mi> 
       </msub> 
      </mrow> 
     </math> in relation to a requiring module 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          i 
        </mi> 
       </msub> 
      </mrow> 
     </math>. This is realized by the following function taking the respective indices 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>
        i 
      </mi> 
     </math> and 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>
        j 
      </mi> 
     </math> of the modules. This function 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         p 
       </mi> 
       <mi>
         r 
       </mi> 
       <mi>
         o 
       </mi> 
       <mi>
         v 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         d 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         d 
       </mi> 
       <mtext>
         _ 
       </mtext> 
       <mi>
         o 
       </mi> 
       <mi>
         p 
       </mi> 
       <mi>
         s 
       </mi> 
      </mrow> 
     </math> returns the subset of 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          M 
        </mi> 
        <mi>
          j 
        </mi> 
       </msub> 
      </mrow> 
     </math> representing the provided operations. This resembles Option 1:</p>
    <p>
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         p 
       </mi> 
       <mi>
         r 
       </mi> 
       <mi>
         o 
       </mi> 
       <mi>
         v 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         d 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         d 
       </mi> 
       <mtext>
         _ 
       </mtext> 
       <mi>
         o 
       </mi> 
       <mi>
         p 
       </mi> 
       <mi>
         s 
       </mi> 
       <mrow> 
        <mo>
          ( 
        </mo> 
        <mrow> 
         <mi>
           i 
         </mi> 
         <mo>
           , 
         </mo> 
         <mi>
           j 
         </mi> 
        </mrow> 
        <mo>
          ) 
        </mo> 
       </mrow> 
       <mo>
         = 
       </mo> 
       <mrow> 
        <mo>
          { 
        </mo> 
        <mrow> 
         <msub> 
          <mi>
            o 
          </mi> 
          <mi>
            j 
          </mi> 
         </msub> 
         <mo>
           ∈ 
         </mo> 
         <msub> 
          <mi>
            M 
          </mi> 
          <mi>
            j 
          </mi> 
         </msub> 
         <mo>
           | 
         </mo> 
         <mo>
           ∃ 
         </mo> 
         <msub> 
          <mi>
            o 
          </mi> 
          <mi>
            i 
          </mi> 
         </msub> 
         <mo>
           ∈ 
         </mo> 
         <msub> 
          <mi>
            M 
          </mi> 
          <mi>
            i 
          </mi> 
         </msub> 
         <mtext>
             
         </mtext> 
         <mo>
           ∃ 
         </mo> 
         <mrow> 
          <mo>
            ( 
          </mo> 
          <mrow> 
           <msub> 
            <mi>
              o 
            </mi> 
            <mi>
              i 
            </mi> 
           </msub> 
           <mo>
             , 
           </mo> 
           <msub> 
            <mi>
              o 
            </mi> 
            <mi>
              j 
            </mi> 
           </msub> 
          </mrow> 
          <mo>
            ) 
          </mo> 
         </mrow> 
         <mo>
           ∈ 
         </mo> 
         <msub> 
          <mi>
            E 
          </mi> 
          <mrow> 
           <mi>
             s 
           </mi> 
           <mi>
             u 
           </mi> 
           <mi>
             b 
           </mi> 
          </mrow> 
         </msub> 
        </mrow> 
        <mo>
          } 
        </mo> 
       </mrow> 
      </mrow> 
     </math></p>
    <p>Step Three: As the previous step creates one provided interface for each requiring module, in this step, we identify identical sets of provided operations and create a set of tuples 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>
        P 
      </mi> 
     </math> that contain the module index 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>
        j 
      </mi> 
     </math> and the respective set of operations:</p>
    <p>
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         P 
       </mi> 
       <mo>
         = 
       </mo> 
       <mrow> 
        <mo>
          { 
        </mo> 
        <mrow> 
         <mrow> 
          <mo>
            ( 
          </mo> 
          <mrow> 
           <mi>
             j 
           </mi> 
           <mo>
             , 
           </mo> 
           <mi>
             p 
           </mi> 
           <mi>
             r 
           </mi> 
           <mi>
             o 
           </mi> 
           <mi>
             v 
           </mi> 
           <mi>
             i 
           </mi> 
           <mi>
             d 
           </mi> 
           <mi>
             e 
           </mi> 
           <mi>
             d 
           </mi> 
           <mtext>
             _ 
           </mtext> 
           <mi>
             o 
           </mi> 
           <mi>
             p 
           </mi> 
           <mi>
             s 
           </mi> 
           <mrow> 
            <mo>
              ( 
            </mo> 
            <mrow> 
             <mi>
               i 
             </mi> 
             <mo>
               , 
             </mo> 
             <mi>
               j 
             </mi> 
            </mrow> 
            <mo>
              ) 
            </mo> 
           </mrow> 
          </mrow> 
          <mo>
            ) 
          </mo> 
         </mrow> 
         <mo>
           | 
         </mo> 
         <mi>
           i 
         </mi> 
         <mo>
           ∈ 
         </mo> 
         <mn>
           0 
         </mn> 
         <mo>
           ⋯ 
         </mo> 
         <mi>
           n 
         </mi> 
        </mrow> 
        <mo>
          } 
        </mo> 
       </mrow> 
      </mrow> 
     </math></p>
    <p>This step can be augmented by defining a similarity, allowing the merging of sets of operations.</p>
    <p>Step Four: Identifies the use of provided interfaces and creates matching required interfaces to the required modules. For this purpose, we define the function 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         r 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         q 
       </mi> 
       <mi>
         u 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         r 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         n 
       </mi> 
       <mi>
         g 
       </mi> 
       <mtext>
         _ 
       </mtext> 
       <mi>
         m 
       </mi> 
       <mi>
         o 
       </mi> 
       <mi>
         d 
       </mi> 
       <mi>
         u 
       </mi> 
       <mi>
         l 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         s 
       </mi> 
      </mrow> 
     </math> that returns the set of indices of all requiring modules for a given provided interface 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          I 
        </mi> 
        <mi>
          p 
        </mi> 
       </msub> 
      </mrow> 
     </math>, where 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <msub> 
        <mi>
          I 
        </mi> 
        <mi>
          p 
        </mi> 
       </msub> 
      </mrow> 
     </math> represents the second element of a tuple of 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>
        P 
      </mi> 
     </math>:</p>
    <p>
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         r 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         q 
       </mi> 
       <mi>
         u 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         r 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         n 
       </mi> 
       <mi>
         g 
       </mi> 
       <mtext>
         _ 
       </mtext> 
       <mi>
         m 
       </mi> 
       <mi>
         o 
       </mi> 
       <mi>
         d 
       </mi> 
       <mi>
         u 
       </mi> 
       <mi>
         l 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         s 
       </mi> 
       <mrow> 
        <mo>
          ( 
        </mo> 
        <mrow> 
         <msub> 
          <mi>
            I 
          </mi> 
          <mi>
            p 
          </mi> 
         </msub> 
        </mrow> 
        <mo>
          ) 
        </mo> 
       </mrow> 
       <mo>
         = 
       </mo> 
       <mrow> 
        <mo>
          { 
        </mo> 
        <mrow> 
         <mi>
           i 
         </mi> 
         <mo>
           | 
         </mo> 
         <mo>
           ∃ 
         </mo> 
         <mi>
           j 
         </mi> 
         <mo>
           , 
         </mo> 
         <mi>
           p 
         </mi> 
         <mi>
           r 
         </mi> 
         <mi>
           o 
         </mi> 
         <mi>
           v 
         </mi> 
         <mi>
           i 
         </mi> 
         <mi>
           d 
         </mi> 
         <mi>
           e 
         </mi> 
         <mi>
           d 
         </mi> 
         <mtext>
           _ 
         </mtext> 
         <mi>
           o 
         </mi> 
         <mi>
           p 
         </mi> 
         <mi>
           s 
         </mi> 
         <mrow> 
          <mo>
            ( 
          </mo> 
          <mrow> 
           <mi>
             i 
           </mi> 
           <mo>
             , 
           </mo> 
           <mi>
             j 
           </mi> 
          </mrow> 
          <mo>
            ) 
          </mo> 
         </mrow> 
         <mo>
           = 
         </mo> 
         <msub> 
          <mi>
            I 
          </mi> 
          <mi>
            p 
          </mi> 
         </msub> 
        </mrow> 
        <mo>
          } 
        </mo> 
       </mrow> 
      </mrow> 
     </math></p>
    <p>After this discovery, the architecture model is enriched by adding interface declarations to modules that provide these interfaces. Similarly, each module that requires an interface of another module obtains a required interface declaration ( 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         r 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         q 
       </mi> 
       <mi>
         u 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         r 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         n 
       </mi> 
       <mi>
         g 
       </mi> 
       <mtext>
         _ 
       </mtext> 
       <mi>
         m 
       </mi> 
       <mi>
         o 
       </mi> 
       <mi>
         d 
       </mi> 
       <mi>
         u 
       </mi> 
       <mi>
         l 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         s 
       </mi> 
      </mrow> 
     </math>) that contains a reference to the corresponding provided interface ( 
     <math xmlns="http://www.w3.org/1998/Math/MathML"> <mrow> 
       <mi>
         p 
       </mi> 
       <mi>
         r 
       </mi> 
       <mi>
         o 
       </mi> 
       <mi>
         v 
       </mi> 
       <mi>
         i 
       </mi> 
       <mi>
         d 
       </mi> 
       <mi>
         e 
       </mi> 
       <mi>
         d 
       </mi> 
       <mtext>
         _ 
       </mtext> 
       <mi>
         o 
       </mi> 
       <mi>
         p 
       </mi> 
       <mi>
         s 
       </mi> 
      </mrow> 
     </math>). Thus, the previously discovered architecture model obtains interface declarations and usage information.</p>
    <p>As an example, the results of our interface discovery applied to UVic are presented in fig:uvic-experiment.</p>
   </sec>
   <sec id="s2_4">
    <title>2.4. Architecture Evaluation</title>
    <p>Software engineering aims to modularize software in a way that cohesion is high while coupling among modules is low, and the overall complexity does not increase more than the size of a software project. These direct metrics can be used to measure the maintainability and comprehensibility of large software projects <xref ref-type="bibr" rid="scirp.141591-16">
      [16]
     </xref>. Quality metrics help us to evaluate the quality of architectural designs. They provide insights into the structural quality of architectures or parts of them.</p>
    <p>Our architecture evaluation uses complexity, coupling, and cohesion metrics based on connections between Fortran procedures grouped by files or directories. Specifically, we used two sets of metrics based on counting and information theory. Both metrics work on a coupling graph of the software system, where nodes represent procedures and edges reflect the relationships between these nodes. A relationship can be a call or multiple calls, which both result in one edge, and dataflows, which result in one or two edges, depending on their directionality. Unidirectional dataflow results in an edge representing the flow direction, and bidirectional dataflow results in two edges. Sections 0.0.1 and 0.0.2 present our architecture evaluation via counting metrics and information theory metrics, respectively.</p>
    <p>Counting metrics compute the number of incoming and outgoing edges for each node. They work on the coupling graph introduced above. These metrics provide us with values for each procedure and cumulative values for the whole system.</p>
    <p>Many different software quality metrics have been studied in the literature. For our study, we chose metrics that have been used in the context of software optimization previously:</p>
    <p>These metrics have been used in <xref ref-type="bibr" rid="scirp.141591-17">
      [17]
     </xref> for software automatization.</p>
    <p>Allen proposed information theory-based metrics for size, complexity, and cohesion <xref ref-type="bibr" rid="scirp.141591-18">
      [18]
     </xref>. These metrics are designed to provide a language-independent way of measuring the size, complexity, coupling, and cohesion of software architectures. This metric is used to represent the mental load of a software developer and can, therefore, be used to indicate architecture degradation between versions or the improvement of the software architecture.</p>
    <p>These information theory metrics work with unidirectional graphs. The size metric computes the information content of the graph representing the system. The complexity metric is a sum over subgraphs for each node with edges, i.e., for each node, a subgraph is generated containing only those nodes of the system that are directly connected. Finally, the coupling metric operates on the subgraph only containing inter-module edges and computes the complexity of this subgraph.</p>
    <p>The size usually grows with the number of nodes (procedures) and edges. The complexity depicts the interconnectedness of the graph. If the complexity increases faster than the size, it is an indicator of architectural degradation. Another indicator of architecture degradation is a faster growth of the coupling metric, which focuses on inter-module connections.</p>
   </sec>
  </sec><sec id="s3">
   <title>3. Reverse Engineering of UVic</title>
   <p>The UVic ESM <xref ref-type="bibr" rid="scirp.141591-5">
     [5]
    </xref> includes code on which the development started in the 1960s. Our interface discovery (Section 2.3) identified all procedures called from other components and grouped them by use.</p>
   <p>In the Energy-Moisture Balance Model (EMBM) component, we discovered a central facade <xref ref-type="bibr" rid="scirp.141591-19">
     [19]
    </xref> for calling procedures handling access to most parts of the model. The EMBM facilitates two sub-components, setembm and embm, which provide the facade for the model. They are used to set model variables and control the model during execution. Calls to the model IO are handled by two separate parts, which are interdependent but also duplicate features in other components of the ESM. They are accessible by the facade but are also accessed directly from the outside. Also, some facade calls directly invoke external interfaces. These generate unnecessary coupling between the caller of the facade, the EMBM component, and the component called by the facade. Furthermore, certain facade features are bypassed, and procedures inside the component are directly called.</p>
   <p>
    <xref ref-type="fig" rid="fig2">
     Figure 2
    </xref> shows the resulting UVic architecture. The colored boxes represent portions of the model which reside in the same source directory. The white boxes indicate interfaces provided by a component, and the gray boxes indicate requiring or using an interface.</p>
   <fig id="fig2" position="float">
    <label>Figure 2</label>
    <caption>
     <title>Figure 2. The module structure of the UVic setup. Interfaces are described via ports, with incoming (white) and outgoing (gray) dependencies. Generated with the Kieker architecture visualization Eclipse plugin <xref ref-type="bibr" rid="scirp.141591-20">
       [20]
      </xref>.</title>
    </caption>
    <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId94.jpeg?20250327094006" />
   </fig>
   <p>All procedures are omitted in <xref ref-type="fig" rid="fig2">
     Figure 2
    </xref> to show the overall structure and the inter-dependencies among modules. UVic consists of a central module “modular ocean model” (mom), coupled to an atmospheric energy-moisture balance model (embm), a dynamic-thermodynamic sea ice model (ice), a moses-triffid land model (mtlm), a sediment model (sed), and further shared modules. The code is grouped in multiple source directories that relate to sub-models, common functionality, and library support. It also provides a set of model configuration examples. Each module contains at least setup, IO, restart, and dedicated output procedures. An additional common module contains shared procedures. netcdf is a library used to serialize model output in ESMs, and this module contains procedures to serialize UVic’s model state.</p>
   <p>The analysis of UVic’s reverse-engineered architecture shows an indication of architectural degradation. We illustrate this via some examples of cross-component calls and independent/shared procedures.</p>
   <p>Cross-component calls <xref ref-type="fig" rid="fig3">
     Figure 3
    </xref> shows that the procedure embmout located in the embm component calls unloadland located in the mtlm component. This indicates either low cohesion since the caller and callee are in different components, or tight coupling since the component embm depends on mtlm as a result of the call.</p>
   <fig id="fig3" position="float">
    <label>Figure 3</label>
    <caption>
     <title>Figure 3. The reverse-engineered module structure of the UVic model Version 2.9.2 shows a call from the procedure embmout() of the embm module to the procedure unloadland() located in the mtlm module. The visualization utilized the Kieker trace analysis with the dot layout tool. Zoom-outs are added by hand for better readability.</title>
    </caption>
    <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId95.jpeg?20250327094006" />
   </fig>
   <p>Independent Procedures: The procedure glsbc for boundary conditions of the mtlm component bypasses and does not directly depend on the facade of the component. Other components contain similar procedures.</p>
   <p>Shared Procedures: The getst procedure located in the common component depends on the getrow procedure located in the mom component. Other components contain procedures to extend the setup of components, e.g., procedures for grid usages are located in the embm component.</p>
  </sec><sec id="s4">
   <title>4. Reverse Engineering of MITgcm</title>
   <p>MITgcm <xref ref-type="bibr" rid="scirp.141591-6">
     [6]
    </xref> can be used to simulate the atmosphere, the ocean, and the complete Earth’s climate system. The model follows a modularization scheme and is shipped with a list of pre-configured model variants that also serve as regression tests for the model. Several tutorial configurations are included. We use the model variants provided by the MITgcm designers for our architectural analysis. Each variant has its own setup instructions, but follows a general scheme of assembling source files, resolving dependencies, compilation, and execution <xref ref-type="bibr" rid="scirp.141591-12">
     [12]
    </xref> <xref ref-type="bibr" rid="scirp.141591-21">
     [21]
    </xref>.</p>
   <p>MITgcm comes with a wide variety of configurations for different experiments. For the analysis, we collected general architectural properties on file-based, directory-based, and combined modularizations.</p>
   <p>MITgcm uses a modular concept to organize its files, which may be combined to create specific model variants. The whole project uses base code located in the directories model and eesupp, as well as one directory per module in the pkg directory. In <xref ref-type="fig" rid="fig4">
     Figure 4
    </xref>, the reverse-engineered architecture of the MITgcm model is shown <xref ref-type="bibr" rid="scirp.141591-21">
     [21]
    </xref>.</p>
   <fig id="fig4" position="float">
    <label>Figure 4</label>
    <caption>
     <title>Figure 4. The reverse-engineered module structure of the MITgcm model <xref ref-type="bibr" rid="scirp.141591-21">
       [21]
      </xref>. The visualization uses the Kieker architecture visualization <xref ref-type="bibr" rid="scirp.141591-20">
       [20]
      </xref>.</title>
    </caption>
    <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId96.jpeg?20250327094006" />
   </fig>
   <p>Based on this two-level modularization, we are able to identify different kinds of modules. There are modules with only one provided interface, like dic and seaice, or just two, like gchem, which are called either by the main source or by one other module. This pattern applies to most modules categorized by the documentation as specialized and general-purpose modules. There are a few exceptions, e.g., the Open Boundary Conditions for Regional Modeling obcs module, which has four groups of procedures that are reflected in the interfaces: (a) access by the main model controlling parameters, initialization, and information exchange, (b) special features that can be turned on (e.g., sponge), (c) code for Orlanski boundary and radiation conditions feature, and (d) diagnosis.</p>
   <p>In <xref ref-type="fig" rid="fig5">
     Figure 5
    </xref>, the architecture of the model variant for the Southern Ocean box with Biochemistry so_box_biogeo is depicted as an example. We highlight two areas with a high coupling degree (light gray boxes) that we zoom into. On the left is the component model, and on the right is the components eesupp and optim. All three components are part of the foundational code base <xref ref-type="bibr" rid="scirp.141591-6">
     [6]
    </xref>, providing core, supplemental, and offline optimization features, respectively. All other components have a low coupling degree.</p>
   <fig id="fig5" position="float">
    <label>Figure 5</label>
    <caption>
     <title>Figure 5. The module structure of the MITgcm model variant so_box_biogeo. White boxes indicate the module structure based on static and dynamic data. Dark gray boxes are derived solely from dynamic data. Light gray areas mark enhanced views. The visualization utilized the Kieker trace analysis with the dot layout tool. Zoom-outs are created by hand for better readability.</title>
    </caption>
    <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId97.jpeg?20250327094007" />
   </fig>
   <p>In contrast to the domain-specific parts of the model, there exists infrastructure and library functionality, e.g., the diagnostics module that provides logging for all modules and thus is required by many other modules. However, the requiring modules use different subsets of the diagnostics API, resulting in multiple single procedure interfaces. While most modules follow a common pattern for their composition, this is different for the base infrastructure. Here, functions are put together in one directory to address different concerns, e.g., printing messages.</p>
  </sec><sec id="s5">
   <title>5. Architecture Evaluation of UVic and MITgcm</title>
   <p>In this section, we present the results obtained by applying the analysis techniques introduced earlier to the ESMs UVic and MITgcm. Firstly, we give an overview of the evaluation of different analysis methods in Section 5.1, followed by a detailed discussion of UVic and MITgcm in Section 5.2 and Section 5.3.</p>
   <sec id="s5_1">
    <title>5.1. Overview</title>
    <p>Since we have static and dynamic analyses available, and in the case of static analysis, we can choose between analyzing only call relationships, only dataflow relationships, or both, we have six different analysis methods, displayed in <xref ref-type="fig" rid="fig6">
      Figure 6
     </xref>. The containedness relationships between the analysis methods refer to the identified coupling relationships. As an example, the analysis method combined/call is obtained by simply merging the results of the methods dynamic/call and static/call. To keep this presentation succinct, in the sequel, we mainly focus on the two analysis methods, dynamic/call and combined/both.</p>
    <p>To explain the different kinds of software analyses techniques and their relationships, we first apply the two software quality metrics, StrCoup and LStrCoh, to our ESMs.</p>
    <fig id="fig6" position="float">
     <label>Figure 6</label>
     <caption>
      <title>Figure 6. Hierarchy of analysis methods. At the bottom, we analyze dynamic and static call relationships, and static dataflows. Then, we combine the call and static methods. At the top, all methods are combined.</title>
     </caption>
     <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId98.jpeg?20250327094008" />
    </fig>
    <p>
     <xref ref-type="fig" rid="fig7">
      Figure 7
     </xref> depicts our software quality metrics for the ESMs that we study in this section (namely Global Ocean cs32 × 15, Barotropic Gyre, and Global Oce Biogeo) and for UVic. For each of these four variants, we present the results of the six analysis methods from <xref ref-type="fig" rid="fig6">
      Figure 6
     </xref>. Hence, we have 24 analysis results in <xref ref-type="fig" rid="fig7">
      Figure 7
     </xref>. We use shapes to specify the analysis types and colors to specify the specific ESM variants. As an example, circles represent static/callanalyses, and the color red describes MITgcm cs 32 × 15. Therefore, the red circle specifies the values for the tatic/callanalysis of MITgcm cs 32 × 15, with a LStrCoh value of 4204 and a StrCoup value of 39.</p>
    <fig id="fig7" position="float">
     <label>Figure 7</label>
     <caption>
      <title>Figure 7. Coupling and cohesion metrics of three MITgcm variants and UVic were obtained by our six analysis methods.</title>
     </caption>
     <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId99.jpeg?20250327094008" />
    </fig>
    <p>Note that there are significant differences between the analysis results in <xref ref-type="fig" rid="fig6">
      Figure 6
     </xref>. In particular, the coupling metrics are significantly higher for the analyses including dataflow than for the ones only considering control-flow calls: Each value for analysis including dataflow is higher than each value for each analysis not including dataflow. Further, the dynamic-only analyses metrics report much smaller values for both metrics than the analyses, which also include static analysis data.</p>
    <p>In order to study the differences between the different analysis results, we next take a closer look at the analyses and consider the components, their size, and connections in the following subsection.</p>
    <p>We emphasize again that the metrics given here always measure the existing structure of the software. Therefore, the differences come from applying the different analysis techniques (see <xref ref-type="fig" rid="fig6">
      Figure 6
     </xref>), not from any difference in software quality. This highlights that metrics like StrCoup or LStrCoh are performed on abstractions, like in our case, coupling graphs, and their results greatly depend on how these abstractions are obtained from the original software.</p>
   </sec>
   <sec id="s5_2">
    <title>5.2. Evaluation of UVic</title>
    <p>We now take a closer look at two analysis results of UVic, namely the dynamic/call analysis in <xref ref-type="table" rid="table1">
      Table 1
     </xref> and the combined/call in <xref ref-type="table" rid="table2">
      Table 2
     </xref>. For each component of these analyses, we list its size (i.e., the number of its units), as well as its number of independent pairs and its fan-out. The second-to-last line in each table contains the sum of the component sizes (i.e., the number of units found by the corresponding analysis), as well as the average values of the columns indPairs and fanOut—i.e., LStrCoh and StrCoup, respectively.</p>
    <p>There are some notable differences between these analysis results. Obviously, the purely dynamic analysis (<xref ref-type="table" rid="table1">
      Table 1
     </xref>) has the lowest coverage with a size of 305 units, whereas the static analysis (table omitted here) identifies a size of 439 units. The combination of both architecture models of UVic (<xref ref-type="table" rid="table2">
      Table 2
     </xref>) measures 456 units, indicating that there are calls that are not detectable by the static analysis, like library calls, that are covered by the dynamic analysis. The static dataflow analysis has a higher size yet, as often data flows in both directions along calls and access to common blocks, i.e., shared global variables, are also incorporated in the analysis graph. This most complex graph is produced when combining dynamic calls, static calls, and dataflows, resulting in 477.</p>
    <p>In general, such differences between dynamic and static analyses are not surprising: While static analysis, by design, takes the entire software into account, dynamic analysis only records information about the parts of the program used in the studied run of the system. However, the dynamic analysis allows us to identify the portions of the ESM that were actually used. Difference graphs can be generated to indicate deviations that might lead to the removal of unused code and refine interfaces.</p>
    <p>In UVic, the normalized StrCoup values range from 0.06 to 0.07 for the call-only analyses and from 0.14 to 0.15 for the analysis, including dataflow.</p>
    <p>Similarly, the normalized values for LStrCoh are also very close to each other: With the exception of the dynamic/call analysis (which is an outlier as it is based on a relatively small set of call data, as discussed above), the resulting values for UVic, these are between 0.0121 and 0.0129. In contrast to StrCoup, adding dataflow does not make a big difference here. The reason is that here, we count the number of independent pairs of units, so whether edges are bidirectional or uni-directional does not make a difference.</p>
    <p>These normalizations also serve as an indicator that MITgcm’s internal structure is, in fact, better than that of UVic, as the normalized StrCoup metrics are approximately half of the corresponding value for UVic for all of our analysis techniques.</p>
    <table-wrap id="table1">
     <label>
      <xref ref-type="table" rid="table1">
       Table 1
      </xref></label>
     <caption>
      <title>
       <xref ref-type="bibr" rid="scirp.141591-"></xref>Table 1. UVic analyzed with dynamic/call.</title>
     </caption>
     <table class="MsoTableGrid custom-table" border="0" cellspacing="0" cellpadding="0"> 
      <tr> 
       <td class="custom-bottom-td custom-top-td acenter" width="16.73%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="27.72%"><p style="text-align:center">COMPONENT NAME</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="16.14%"><p style="text-align:center">SIZE</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="20.70%"><p style="text-align:center">INDPAIRS</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="18.71%"><p style="text-align:center">FAN-OUT</p></td> 
      </tr> 
      <tr> 
       <td class="custom-top-td acenter" width="16.73%"><p style="text-align:center">1</p></td> 
       <td class="custom-top-td aleft" width="27.72%"><p style="text-align:left">common</p></td> 
       <td class="custom-top-td acenter" width="16.14%"><p style="text-align:center">114</p></td> 
       <td class="custom-top-td acenter" width="20.70%"><p style="text-align:center">6237</p></td> 
       <td class="custom-top-td acenter" width="18.71%"><p style="text-align:center">30</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">2</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">embm</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">35</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">558</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">25</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">3</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">ice</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">11</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">45</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">2</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">4</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">mom</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">72</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">2477</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">32</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">5</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">mtlm</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">29</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">373</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">19</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">6</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">netcdf</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">18</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">134</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">7</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">sed</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">26</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">293</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">15</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center"></p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">∑/LStrCoh/StrCoup</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">305</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">1445.29</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">17.57</p></td> 
      </tr> 
      <tr> 
       <td class="custom-bottom-td acenter" width="16.73%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td aleft" width="27.72%"><p style="text-align:left">normalized</p></td> 
       <td class="custom-bottom-td acenter" width="16.14%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td acenter" width="20.70%"><p style="text-align:center">0.0155</p></td> 
       <td class="custom-bottom-td acenter" width="18.71%"><p style="text-align:center">0.06</p></td> 
      </tr> 
     </table>
    </table-wrap>
    <table-wrap id="table2">
     <label>
      <xref ref-type="table" rid="table2">
       Table 2
      </xref></label>
     <caption>
      <title>
       <xref ref-type="bibr" rid="scirp.141591-"></xref>Table 2. UVic analyzed with combined/call.</title>
     </caption>
     <table class="MsoTableGrid custom-table" border="0" cellspacing="0" cellpadding="0"> 
      <tr> 
       <td class="custom-bottom-td custom-top-td acenter" width="16.73%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="27.72%"><p style="text-align:center">COMPONENT NAME</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="16.14%"><p style="text-align:center">SIZE</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="20.70%"><p style="text-align:center">INDPAIRS</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="18.71%"><p style="text-align:center">FAN-OUT</p></td> 
      </tr> 
      <tr> 
       <td class="custom-top-td acenter" width="16.73%"><p style="text-align:center">1</p></td> 
       <td class="custom-top-td aleft" width="27.72%"><p style="text-align:left">??&lt;runtime&gt;</p></td> 
       <td class="custom-top-td acenter" width="16.14%"><p style="text-align:center">32</p></td> 
       <td class="custom-top-td acenter" width="20.70%"><p style="text-align:center">496</p></td> 
       <td class="custom-top-td acenter" width="18.71%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">2</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">common</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">154</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">11513</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">64</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">3</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">embm</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">39</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">701</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">49</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">4</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">ice</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">12</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">56</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">11</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">5</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">mom</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">115</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">6428</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">63</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">6</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">mtlm</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">33</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">487</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">40</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">7</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">netcdf</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">28</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">341</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">8</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center">8</p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">sed</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">43</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">841</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">37</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="16.73%"><p style="text-align:center"></p></td> 
       <td class="aleft" width="27.72%"><p style="text-align:left">∑/LStrCoh/StrCoup</p></td> 
       <td class="acenter" width="16.14%"><p style="text-align:center">456</p></td> 
       <td class="acenter" width="20.70%"><p style="text-align:center">2607.88</p></td> 
       <td class="acenter" width="18.71%"><p style="text-align:center">34.00</p></td> 
      </tr> 
      <tr> 
       <td class="custom-bottom-td acenter" width="16.73%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td aleft" width="27.72%"><p style="text-align:left">normalized</p></td> 
       <td class="custom-bottom-td acenter" width="16.14%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td acenter" width="20.70%"><p style="text-align:center">0.0125</p></td> 
       <td class="custom-bottom-td acenter" width="18.71%"><p style="text-align:center">0.07</p></td> 
      </tr> 
     </table>
    </table-wrap>
    <p>As shown in <xref ref-type="table" rid="table3">
      Table 3
     </xref>, we computed for UVic Versions 2.6 to 2.9.2 their size and complexity utilizing the Allen metrics <xref ref-type="bibr" rid="scirp.141591-18">
      [18]
     </xref>.</p>
    <table-wrap id="table3">
     <label>
      <xref ref-type="table" rid="table3">
       Table 3
      </xref></label>
     <caption>
      <title>
       <xref ref-type="bibr" rid="scirp.141591-"></xref>Table 3. Allen complexity and size metric results for Versions 2.6 to 2.9.2 of UVic.</title>
     </caption>
     <table class="MsoTableGrid custom-table" border="0" cellspacing="0" cellpadding="0"> 
      <tr> 
       <td class="custom-bottom-td custom-top-td acenter" width="22.61%"><p style="text-align:center">Version</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="22.61%"><p style="text-align:center">Complexity</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="22.61%"><p style="text-align:center">Size</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="22.61%"><p style="text-align:center">Ratio</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="22.61%"><p style="text-align:center">LOC</p></td> 
      </tr> 
      <tr> 
       <td class="custom-top-td acenter" width="22.61%"><p style="text-align:center">2.6</p></td> 
       <td class="custom-top-td acenter" width="22.61%"><p style="text-align:center">1948.92</p></td> 
       <td class="custom-top-td acenter" width="22.61%"><p style="text-align:center">2133.95</p></td> 
       <td class="custom-top-td acenter" width="22.61%"><p style="text-align:center">0.913</p></td> 
       <td class="custom-top-td acenter" width="22.61%"><p style="text-align:center">49,869</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.7</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2372.68</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2522.46</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">0.941</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">55,188</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.7.1</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2372.68</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2522.46</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">0.941</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">55,213</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.7.2</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2372.68</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2522.46</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">0.941</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">55,218</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.7.3</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2376.63</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2541.88</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">0.935</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">55,922</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.7.4</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2830.96</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2776.33</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">1.020</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">58,719</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.7.5</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2800.76</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2805.82</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">0.998</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">58,995</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.8</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2899.16</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2727.28</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">1.063</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">57,348</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.9</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">3678.48</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">3185.78</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">1.155</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">60,340</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="22.61%"><p style="text-align:center">2.9.1</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">3678.48</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">3185.78</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">1.155</p></td> 
       <td class="acenter" width="22.61%"><p style="text-align:center">60,457</p></td> 
      </tr> 
      <tr> 
       <td class="custom-bottom-td acenter" width="22.61%"><p style="text-align:center">2.9.2</p></td> 
       <td class="custom-bottom-td acenter" width="22.61%"><p style="text-align:center">3678.48</p></td> 
       <td class="custom-bottom-td acenter" width="22.61%"><p style="text-align:center">3185.78</p></td> 
       <td class="custom-bottom-td acenter" width="22.61%"><p style="text-align:center">1.155</p></td> 
       <td class="custom-bottom-td acenter" width="22.61%"><p style="text-align:center">60,706</p></td> 
      </tr> 
     </table>
    </table-wrap>
    <p>As <xref ref-type="table" rid="table3">
      Table 3
     </xref> shows, the complexity increases faster, especially from Version 2.8 to Version 2.9, indicating increasing inter-dependencies and, therefore, architecture degradation. In our interviews, the model developers referred to the code as ‘spaghetti code.’ Between Versions 2.7.5 and 2.8, we can see that the complexity increases while the lines of code decrease, indicating growing interconnections.</p>
   </sec>
   <sec id="s5_3">
    <title>5.3. Evaluation of MITgcm Global Ocean</title>
    <p>Out of the three MITgcm variants mentioned in <xref ref-type="fig" rid="fig7">
      Figure 7
     </xref>, we focus on Global Ocean cs32 × 15 since this is the largest of the three. The results and takeaways are comparable for these three variants.</p>
    <p>In the same way, as for UVic above, we now take a closer look at three analysis results of MITgcm Global ocean cs32 × 15, namely the dynamic/call, combinedPlainCallMap, and ombined/both analyses (see <xref ref-type="table" rid="tableTables 4-6">
      Tables 4-6
     </xref>).</p>
    <p>As expected, the absolute values of these metrics differ significantly between the different analyses. One reason for this is that, as discussed before, the size of the models resulting from the analyses is quite different (this is apparent from the “size” column in <xref ref-type="table" rid="table4">
      Table 4
     </xref>, <xref ref-type="table" rid="table5">
      Table 5
     </xref>).</p>
    <p>To allow for more meaningful comparisons of the metric values that account for the size differences, we also consider normalized values of LStrCoh and StrCoup in the last line of each table. These values are obtained by dividing the metric values by (for StrCoup), the number of units discovered by the analysis, and (for LStrCoh) the squared number of units. We treat these two differently since StrCoup counts connections to units and, therefore, is a linear measure, while LStrCoh counts pairs of units and is therefore, quadratic.</p>
    <table-wrap id="table4">
     <label>
      <xref ref-type="table" rid="table4">
       Table 4
      </xref></label>
     <caption>
      <title>
       <xref ref-type="bibr" rid="scirp.141591-"></xref>Table 4. MITgcm analyzed with dynamic/call.</title>
     </caption>
     <table class="MsoTableGrid custom-table" border="0" cellspacing="0" cellpadding="0"> 
      <tr> 
       <td class="custom-bottom-td custom-top-td acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="31.69%"><p style="text-align:center">COMPONENT NAME</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="12.06%"><p style="text-align:center">SIZE</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="20.62%"><p style="text-align:center">INDPAIRS</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="18.60%"><p style="text-align:center">FAN-OUT</p></td> 
      </tr> 
      <tr> 
       <td class="custom-top-td acenter" width="17.03%"><p style="text-align:center">1</p></td> 
       <td class="custom-top-td aleft" width="31.69%"><p style="text-align:left">no-file</p></td> 
       <td class="custom-top-td acenter" width="12.06%"><p style="text-align:center">2</p></td> 
       <td class="custom-top-td acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="custom-top-td acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">2</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">unknown-component</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">3</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mnc_create_dir</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">4</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">bulk_force</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">5</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">cal</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">6</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">diagnostics</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">3</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">2</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">7</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">7</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">eesupp</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">8</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">exch2</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">11</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">45</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">3</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">9</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">exf</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">10</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">ggl90</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">11</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">gmredi</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">3</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">12</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mdsio</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">3</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">13</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mnc</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">10</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">37</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">5</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">14</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">monitor</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">3</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">4</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">15</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">openad</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">16</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">rw</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">4</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">6</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">17</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">seaice</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">18</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">src</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">51</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1201</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">21</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">19</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">thsice</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">∑/LStrCoh/StrCoup</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">96</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">68.00</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">2.84</p></td> 
      </tr> 
      <tr> 
       <td class="custom-bottom-td acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td aleft" width="31.69%"><p style="text-align:left">normalized</p></td> 
       <td class="custom-bottom-td acenter" width="12.06%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td acenter" width="20.62%"><p style="text-align:center">0.0074</p></td> 
       <td class="custom-bottom-td acenter" width="18.60%"><p style="text-align:center">0.03</p></td> 
      </tr> 
     </table>
    </table-wrap>
    <table-wrap id="table5">
     <label>
      <xref ref-type="table" rid="table5">
       Table 5
      </xref></label>
     <caption>
      <title>
       <xref ref-type="bibr" rid="scirp.141591-"></xref>Table 5. MITgcm analyzed with combined/call.</title>
     </caption>
     <table class="MsoTableGrid custom-table" border="0" cellspacing="0" cellpadding="0"> 
      <tr> 
       <td class="custom-bottom-td custom-top-td acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="31.69%"><p style="text-align:center">COMPONENT NAME</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="12.06%"><p style="text-align:center">SIZE</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="20.62%"><p style="text-align:center">INDPAIRS</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="18.60%"><p style="text-align:center">FAN-OUT</p></td> 
      </tr> 
      <tr> 
       <td class="custom-top-td acenter" width="17.03%"><p style="text-align:center">1</p></td> 
       <td class="custom-top-td aleft" width="31.69%"><p style="text-align:left">++no-file++</p></td> 
       <td class="custom-top-td acenter" width="12.06%"><p style="text-align:center">2</p></td> 
       <td class="custom-top-td acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="custom-top-td acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">2</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">++...</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">3</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">??/home/...</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">4</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">??(runtime)</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">47</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1081</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">5</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">bulk_force</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">11</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">50</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">23</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">6</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">cal</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">30</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">382</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">16</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">7</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">debug</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">13</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">73</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">14</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">8</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">diagnostics</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">66</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">2073</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">57</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">9</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">eesupp</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">10</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">exch2</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">111</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">5999</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">19</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">11</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">exf</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">42</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">826</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">58</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">12</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">generic_advdiff</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">98</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">4631</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">37</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">13</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">ggl90</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">16</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">114</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">34</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">14</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">gmredi</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">22</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">223</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">48</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">15</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mdsio</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">28</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">329</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">19</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">16</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mnc</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">93</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">4096</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">15</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">17</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mom_common</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">27</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">348</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">12</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">18</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mom_fluxform</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">20</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">171</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">20</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">19</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mom_vecinv</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">12</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">55</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">33</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">20</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">monitor</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">27</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">315</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">26</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">21</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">openad</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">2</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">12</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">22</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">rw</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">53</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1376</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">22</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">23</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">seaice</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">60</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1695</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">100</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">24</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">src</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">372</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">68353</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">221</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">25</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">thsice</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">35</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">567</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">68</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">26</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">timeave</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">16</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">109</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">17</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">∑/LStrCoh/StrCoup</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1206</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">3571.81</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">33.54</p></td> 
      </tr> 
      <tr> 
       <td class="custom-bottom-td acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td aleft" width="31.69%"><p style="text-align:left">normalized</p></td> 
       <td class="custom-bottom-td acenter" width="12.06%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td acenter" width="20.62%"><p style="text-align:center">0.0025</p></td> 
       <td class="custom-bottom-td acenter" width="18.60%"><p style="text-align:center">0.03</p></td> 
      </tr> 
     </table>
    </table-wrap>
    <table-wrap id="table6">
     <label>
      <xref ref-type="table" rid="table6">
       Table 6
      </xref></label>
     <caption>
      <title>
       <xref ref-type="bibr" rid="scirp.141591-"></xref>Table 6. MITgcm analyzed with combined/both.</title>
     </caption>
     <table class="MsoTableGrid custom-table" border="0" cellspacing="0" cellpadding="0"> 
      <tr> 
       <td class="custom-bottom-td custom-top-td acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="31.69%"><p style="text-align:center">COMPONENT NAME</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="12.06%"><p style="text-align:center">SIZE</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="20.62%"><p style="text-align:center">INDPAIRS</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="18.60%"><p style="text-align:center">FAN-OUT</p></td> 
      </tr> 
      <tr> 
       <td class="custom-top-td acenter" width="17.03%"><p style="text-align:center">1</p></td> 
       <td class="custom-top-td aleft" width="31.69%"><p style="text-align:left">no-file</p></td> 
       <td class="custom-top-td acenter" width="12.06%"><p style="text-align:center">2</p></td> 
       <td class="custom-top-td acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="custom-top-td acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">2</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">unknown-component</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">1</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">3</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mnc_create_dir.c</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">4</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">&lt;runtime&gt;</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">47</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1054</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">434</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">5</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">bulk_force</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">11</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">50</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">30</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">6</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">cal</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">32</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">443</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">33</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">7</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">debug</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">13</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">73</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">48</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">8</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">diagnostics</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">67</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">2139</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">126</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">9</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">eesupp</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">0</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">0</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">10</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">exch2</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">111</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">5999</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">69</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">11</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">exf</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">42</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">826</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">65</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">12</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">generic_advdiff</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">98</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">4631</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">48</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">13</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">gg190</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">16</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">114</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">43</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">14</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">gmredi</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">22</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">223</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">59</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">15</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mdsio</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">34</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">512</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">68</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">16</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mnc</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">93</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">4096</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">49</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">17</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mom_common</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">27</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">348</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">18</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">18</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">Mom_fluxform</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">20</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">171</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">21</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">19</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">mom_vecinv</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">12</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">55</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">34</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">20</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">monitor</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">27</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">315</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">35</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">21</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">openad</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">4</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">6</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">13</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">22</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">rw</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">54</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1429</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">72</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">23</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">seaice</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">60</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">1695</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">109</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">24</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">src</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">393</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">76374</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">439</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">25</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">thsice</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">37</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">638</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">78</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center">26</p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">timeave</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">16</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">109</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">33</p></td> 
      </tr> 
      <tr> 
       <td class="acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="aleft" width="31.69%"><p style="text-align:left">∑/LStrCoh/StrCoup</p></td> 
       <td class="acenter" width="12.06%"><p style="text-align:center">1241</p></td> 
       <td class="acenter" width="20.62%"><p style="text-align:center">3896.15</p></td> 
       <td class="acenter" width="18.60%"><p style="text-align:center">33.54</p></td> 
      </tr> 
      <tr> 
       <td class="custom-bottom-td acenter" width="17.03%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td aleft" width="31.69%"><p style="text-align:left">normalized</p></td> 
       <td class="custom-bottom-td acenter" width="12.06%"><p style="text-align:center"></p></td> 
       <td class="custom-bottom-td acenter" width="20.62%"><p style="text-align:center">0.0025</p></td> 
       <td class="custom-bottom-td acenter" width="18.60%"><p style="text-align:center">0.06</p></td> 
      </tr> 
     </table>
    </table-wrap>
    <p>From our results, we can also observe the above-mentioned difference between analyses including dataflow and those using only call data (comparing the analyses combined/call from <xref ref-type="table" rid="table5">
      Table 5
     </xref> and ombined/both from <xref ref-type="table" rid="table6">
      Table 6
     </xref>):</p>
    <p>While the number of detected units is pretty close (the analysis including dataflow adds a further 35 units; these are most likely Fortran common blocks), the average fan-out of the components (i.e., StrCoup) is more than doubled by adding dataflow analysis. This is because dataflow usually exists in both directions between two operations, if data flows at all (e.g., with parameters in one direction and return values in the other direction), while call relationships often only exist in one direction. Therefore, the number of directed edges is much larger for a dataflow analysis.</p>
    <p>Note also that the normalized values of StrCoup are very close to each other: For the variant Global Ocean cs32 × 15 shown in the tables, the normalized values of StrCoup range from 0.03 to 0.07 (compared to the original ranges 2.84 to 87.32 for MITgcm). More interestingly, the thus-normalized StrCoup is 0.03 for all MITgcm analyses, including only call relationships (<xref ref-type="table" rid="table3">
      Table 3
     </xref> and <xref ref-type="table" rid="table5">
      Table 5
     </xref>, and the analysis results found in the supplementary material), and is 0.06 or 0.07 for the MITgcm analyses that include dataflow relationships. Hence, the normalizations indicate that the increased coverage of the analysis methods explains some of the differences observed in the metrics. This also shows that normalization captures the difference between analyses including dataflow and those omitting it better than the original metrics.</p>
    <p>Similarly, the normalized values for LStrCoh are also very close to each other: With the exception of the dynamic/call analysis (which is an outlier as it is based on a relatively small set of call data, as discussed above), the resulting values for MITgcm are all between 0.0025 and 0.0031. These measurements are only a 1/4 of UVic measurements, which are between 0.0121 and 0.0129, indicating that the overall architecture of MITgcm is in better shape.</p>
    <p>In contrast to StrCoup, adding dataflow does not make a big difference here. This is because here, we count the number of independent pairs of units, so whether edges are bidirectional or unidirectional does not make a difference.</p>
    <p>For MITgcm, we computed complexity and size with the Allen metrics and estimated the coupling degree for different variants and versions. Due to the large number of variants, we display the results as a histogram in <xref ref-type="fig" rid="fig8">
      Figure 8
     </xref>. It shows that most variants range from 6000 to 7000, and more complex variants are less frequent.</p>
    <fig id="fig8" position="float">
     <label>Figure 8</label>
     <caption>
      <title>Figure 8. Architecture complexity for all MITgcm model variants.</title>
     </caption>
     <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId100.jpeg?20250327094013" />
    </fig>
    <p>We compared the size and complexity based on the Allen metrics, see <xref ref-type="fig" rid="fig9">
      Figure 9
     </xref>. The data suggests that complexity grows faster than size. The fitted curve describes the relationship of the complexity to the size as logarithmic.</p>
    <p>There is a group of outliers of 3 ESM variants between 5000 and 6500 bits of complexity that have exceptionally high values. These variants use the fizhi module that addresses atmosphere physics. This indicates that this module introduces a lot of procedures, but fewer calls than in the remaining model.</p>
    <p>As shown in <xref ref-type="fig" rid="fig9">
      Figure 9
     </xref>, the largest and most complex ESM variant is Global Ocean cs32 × 15. Thus, we picked this variant to compute the Allen metrics <xref ref-type="bibr" rid="scirp.141591-18">
      [18]
     </xref> for all versions of the ESM.</p>
    <fig id="fig9" position="float">
     <label>Figure 9</label>
     <caption>
      <title>Figure 9. Architecture complexity to size relationship for all selected MITgcm variants.</title>
     </caption>
     <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId101.jpeg?20250327094013" />
    </fig>
    <p>In <xref ref-type="table" rid="table7">
      Table 7
     </xref>, we depict major versions of MITgcm, whereas in fig:mitgcm:allen, we show the measurements for all versions from checkpoint54 to checkpoint69a.</p>
    <p>We omit the lines of code measurements (LOC), as due to the build system of MITgcm, we could not safely detect whuch parts of the code are actually used for a model variant, and we could not extract this information from the Fortran parser used to collect calls and dataflows.</p>
    <table-wrap id="table7">
     <label>
      <xref ref-type="table" rid="table7">
       Table 7
      </xref></label>
     <caption>
      <title>
       <xref ref-type="bibr" rid="scirp.141591-"></xref>Table 7. Allen complexity and size metric results for Versions checkpoint54 to checkpoint69a (key versions only).</title>
     </caption>
     <table class="MsoTableGrid custom-table" border="0" cellspacing="0" cellpadding="0"> 
      <tr> 
       <td class="custom-bottom-td custom-top-td acenter" width="24.99%"><p style="text-align:center">Version</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="24.99%"><p style="text-align:center">Complexity</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="25.01%"><p style="text-align:center">Size</p></td> 
       <td class="custom-bottom-td custom-top-td acenter" width="25.01%"><p style="text-align:center">Ratio</p></td> 
      </tr> 
      <tr> 
       <td class="custom-top-td aleft" width="24.99%"><p style="text-align:left">checkpoint54</p></td> 
       <td class="custom-top-td acenter" width="24.99%"><p style="text-align:center">32085.59</p></td> 
       <td class="custom-top-td acenter" width="25.01%"><p style="text-align:center">12445.79</p></td> 
       <td class="custom-top-td acenter" width="25.01%"><p style="text-align:center">2.578</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint55</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">32085.59</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">12445.79</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.578</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint57</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">32085.59</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">12445.79</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.578</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint58</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">32085.59</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">12445.79</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.578</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint59a</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">33065.04</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13361.10</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.475</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint60</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">33357.39</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13537.92</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.464</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint61</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">33357.39</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13537.92</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.464</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint62</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">33357.39</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13537.92</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.464</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint63</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">31161.24</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13465.16</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.314</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint64</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">32759.68</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13476.95</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.431</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint65</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">32602.79</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13406.23</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.432</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint66a</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">32492.55</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13382.66</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.428</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint67</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">33092.39</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13443.58</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.462</p></td> 
      </tr> 
      <tr> 
       <td class="aleft" width="24.99%"><p style="text-align:left">checkpoint68a</p></td> 
       <td class="acenter" width="24.99%"><p style="text-align:center">34743.43</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">13644.12</p></td> 
       <td class="acenter" width="25.01%"><p style="text-align:center">2.546</p></td> 
      </tr> 
      <tr> 
       <td class="custom-bottom-td aleft" width="24.99%"><p style="text-align:left">checkpoint69a</p></td> 
       <td class="custom-bottom-td acenter" width="24.99%"><p style="text-align:center">34751.12</p></td> 
       <td class="custom-bottom-td acenter" width="25.01%"><p style="text-align:center">13608.71</p></td> 
       <td class="custom-bottom-td acenter" width="25.01%"><p style="text-align:center">2.556</p></td> 
      </tr> 
     </table>
    </table-wrap>
    <p>As the table suggests complexity and size increase over time with some exceptions indicating major architectural changes. As MITgcm has the aim to be a modular ESM that can be used for a wide variety of experiments, such efforts are necessary to be able to be used in that manor. The ratio between complexity and size show that the ESM improves over time, but in the recent version, the ratio increased again.</p>
    <p>In <xref ref-type="fig" rid="fig10">
      Figure 10
     </xref>, we can see a sudden jump in size around checkpoint59a, which also increased the complexity, while at the same time, efforts were made to reduce the coupling of modules in MITgcm, effectively improving the architecture. Another effort to reduce coupling was made between checkpoint62f and checkpoint62g, resulting in less complex major release checkpoint63. After that, the complexity started to increase again without an impact on the overall size and with no relevant impact on the coupling. This shows that functionality inside modules was added or improved. Only in more recent versions did new functionality arrive and cause a large increase in coupling and complexity.</p>
    <fig id="fig10" position="float">
     <label>Figure 10</label>
     <caption>
      <title>Figure 10. Allen complexity, size, and coupling metric results of Global Ocean cs32 × 15 for all Versions from checkpoint54 to checkpoint69a.</title>
     </caption>
     <graphic mimetype="image" position="float" xlink:type="simple" xlink:href="https://html.scirp.org/file/9303388-rId102.jpeg?20250327094013" />
    </fig>
   </sec>
  </sec><sec id="s6">
   <title>6. Related Work</title>
   <p>Alexander and Easterbrook <xref ref-type="bibr" rid="scirp.141591-22">
     [22]
    </xref> analyzed climate model software architectures by considering the model source code. The focus was on analyzing the modularization based on the relative sizes of software components, as well as data flow between components and design decisions. They visualized the software architecture, including the dependencies between the components. The code analysis was performed on preprocessed code with external software. They used a predefined scenario to make the analyses of different models comparable. The developers were contacted for information on design decisions. Different from this work, we conduct a more fine-grained, tool-based architecture analysis employing a combination of static and dynamic analysis.</p>
   <p>Simm et al. <xref ref-type="bibr" rid="scirp.141591-23">
     [23]
    </xref> interviewed model developers and environmental scientists about their approaches to engineering computer-based environmental models. At the architectural level, they found that models are often monolithic and utilize specific coupling interfaces to link to other models. This observation is confirmed by our tool-based architecture analysis.</p>
   <p>Basic architectural diagrams are often created manually for individual models <xref ref-type="bibr" rid="scirp.141591-24">
     [24]
    </xref>-<xref ref-type="bibr" rid="scirp.141591-26">
     [26]
    </xref>. These descriptions only show a general software architecture based on the functionality of the models and their components. The actual climate model’s architecture can differ from these architectural diagrams, due to variant configurations. Compared to these works, we combine static and dynamic analysis to reverse engineer fine-grained architecture information of earth system models.</p>
   <p>Riva and Rodríguez <xref ref-type="bibr" rid="scirp.141591-27">
     [27]
    </xref> also use a combination of static and dynamic analysis for architecture reconstruction, but they used a simulation technique, while the monitoring tools we use can be run on a production system and, therefore, take runtime information into account.</p>
  </sec><sec id="s7">
   <title>7. Conclusions and Future Work</title>
   <p>We analyzed the two ESMs, UVic and MITgcm, to recover their architecture and understand the key properties of their software structure. In both cases, we could not find large portions of unused code. This was expected to be the case for MITgcm, as it emphasizes its modular approach. Based on previous interviews with climate scientists <xref ref-type="bibr" rid="scirp.141591-28">
     [28]
    </xref>, we expected that this would be an issue with UVic. However, there were only minor differences between the static and dynamic analysis regarding the ESM structure. Some differences can be attributed to the use of data handling libraries, which were not detected by the static analysis. Parts only visible in the static analysis were, e.g., debug and logging code, which can be switched on and off at the start time of the model. In the UVic architecture, we found that the major modules heavily rely on each other, which is observable in the directory and file-based modularization scheme.</p>
   <p>Since our data shows that the results of dynamic and static analyses are similar to each other, for some analyses, it might be enough to perform only the (cheaper) static analysis, which is an interesting difference to, for example, interactive web-based systems. Note, however, that there are many types of analyses that simply cannot be done in a static way, such as profiling analyses with the goal of runtime optimizations.</p>
   <p>Additionally, our findings confirm our expectations that the architecture of an ESM differs significantly from that of, e.g., web-based systems, where the differences between dynamic and static analyses are much more significant <xref ref-type="bibr" rid="scirp.141591-29">
     [29]
    </xref>. A possible reason for this is that the design of an ESM can anticipate the way the code will execute much better than the design of an event-based system, where much of the actual behavior depends on events that cannot be predicted at design time.</p>
   <p>With the UVic log, we have also shown that our logging and analysis tools are capable of creating and processing huge logs, which is essential in going forward to analyze even larger community ESMs.</p>
   <p>ESMs process big datasets. The coupling of sub-models is, therefore, also based on data. In our current analysis, we considered dataflow using Fortran common blocks, but did not analyze, e.g., data flow resulting from writing and reading the same files. Based on a more complete picture of control and data flow analyses, we will revisit model coupling issues, which we identified in the ESMs.</p>
   <p>We provided a new approach to discover interfaces based on usage patterns between modules. To potentially increase the quality of these interfaces, one could merge and split these interfaces based on shared use of data types, textual similarity, e.g., identical prefixes and suffixes, substring similarity or distance functions, such as Levenshtein distance <xref ref-type="bibr" rid="scirp.141591-30">
     [30]
    </xref>, which we will address in future work.</p>
  </sec><sec id="s8">
   <title>Funding</title>
   <p>This work is funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) (Grant No. HA 2038/8-1-425916241).</p>
  </sec><sec id="s9">
   <title>NOTES</title>
   <p><sup>1</sup><xref ref-type="bibr" rid="scirp.141591-https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html">
     https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
    </xref>.</p>
   <p><sup>2</sup><xref ref-type="bibr" rid="scirp.141591-https://github.com/cau-se/oceandsl-tools/tree/main/tools/dar">
     https://github.com/cau-se/oceandsl-tools/tree/main/tools/dar
    </xref>.</p>
   <p><sup>3</sup><xref ref-type="bibr" rid="scirp.141591-https://github.com/cau-se/oceandsl-tools/tree/main/tools/fxca">
     https://github.com/cau-se/oceandsl-tools/tree/main/tools/fxca
    </xref>.</p>
   <p><sup>4</sup><xref ref-type="bibr" rid="scirp.141591-https://github.com/cau-se/oceandsl-tools/tree/main/tools/sar">
     https://github.com/cau-se/oceandsl-tools/tree/main/tools/sar
    </xref>.</p>
   <p><sup>5</sup><xref ref-type="bibr" rid="scirp.141591-https://github.com/pmarguinaud/fxtran">
     https://github.com/pmarguinaud/fxtran
    </xref>.</p>
   <p><sup>6</sup><xref ref-type="bibr" rid="scirp.141591-https://fortranwiki.org/fortran/show/procedure">
     https://fortranwiki.org/fortran/show/procedure
    </xref>.</p>
  </sec>
 </body><back>
  <ref-list>
   <title>References</title>
   <ref id="scirp.141591-ref1">
    <label>1</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Johanson, A. and Hasselbring, W. (2018) Software Engineering for Computational Science: Past, Present, Future. Computing in Science&amp;Engineering, 20, 90-109. &gt;https://doi.org/10.1109/mcse.2018.021651343
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref2">
    <label>2</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Jung, R., Gundlach, S. and Hasselbring, W. (2022) Software Development Processes in Ocean System Modeling. International Journal of Modeling, Simulation, and Scientific Computing, 13, Article ID: 2230002. &gt;https://doi.org/10.1142/s1793962322300023
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref3">
    <label>3</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Reussner, R., Goedicke, M., Hasselbring, W., Vogel-Heuser, B., Keim, J. and Märtin, L. (2019) Managed Software Evolution. Springer.&gt;https://link.springer.com/book/10.1007/978-3-030-13499-0
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref4">
    <label>4</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Hasselbring, W. (2018) Software Architecture: Past, Present, Future. In: Gruhn, V. and Striemer, R., Eds., The Essence of Software Engineering, Springer International Publishing, 169-184. &gt;https://doi.org/10.1007/978-3-319-73897-0_10 
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref5">
    <label>5</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Weaver, A.J., Eby, M., Wiebe, E.C., Bitz, C.M., Duffy, P.B., Ewen, T.L., et al. (2001) The Uvic Earth System Climate Model: Model Description, Climatology, and Applications to Past, Present and Future Climates. Atmosphere-Ocean, 39, 361-428. &gt;https://doi.org/10.1080/07055900.2001.9649686
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref6">
    <label>6</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Artale, V., Calmanti, S., Carillo, A., Dell’Aquila, A., Herrmann, M., Pisacane, G., et al. (2009) An Atmosphere-Ocean Regional Climate Model for the Mediterranean Area: Assessment of a Present Climate Simulation. Climate Dynamics, 35, 721-740. &gt;https://doi.org/10.1007/s00382-009-0691-8
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref7">
    <label>7</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Brévière, E.H.G., Bakker, D.C.E., Bange, H.W., Bates, T.S., Bell, T.G., Boyd, P.W., et al. (2015) Surface Ocean-Lower Atmosphere Study: Scientific Synthesis and Contribution to Earth System Science. Anthropocene, 12, 54-68. &gt;https://doi.org/10.1016/j.ancene.2015.11.001
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref8">
    <label>8</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Pahlow, M., Chien, C., Arteaga, L.A. and Oschlies, A. (2020) Optimality-Based Non-Redfield Plankton-Ecosystem Model (OPEM V1.1) in Uvic-ESCM 2.9—Part 1: Implementation and Model Behaviour. Geoscientific Model Development, 13, 4663-4690. &gt;https://doi.org/10.5194/gmd-13-4663-2020
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref9">
    <label>9</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Chien, C., Pahlow, M., Schartau, M. and Oschlies, A. (2020) Optimality-Based Non-Redfield Plankton-Ecosystem Model (OPEM V1.1) in UVic-ESCM 2.9—Part 2: Sensitivity Analysis and Model Calibration. Geoscientific Model Development, 13, 4691-4712. &gt;https://doi.org/10.5194/gmd-13-4691-2020 
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref10">
    <label>10</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Mengis, N., Keller, D.P., MacDougall, A.H., Eby, M., Wright, N., Meissner, K.J., et al. (2020) Evaluation of the University of Victoria Earth System Climate Model Version 2.10 (UVic ESCM 2.10). Geoscientific Model Development, 13, 4183-4204. &gt;https://doi.org/10.5194/gmd-13-4183-2020
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref11">
    <label>11</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Stocker, T.F., et al. (2014) Climate Change 2013—The Physical Science Basis: Working Group I Contribution to the Fifth Assessment Report of the Intergovernmental Panel on Climate Change. Cambridge University Press.
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref12">
    <label>12</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Jung, R., Schnoor, H. and Hasselbring, W. (2024) Replication Package for: Software Architecture Evaluation of Earth System Models.&gt;https://zenodo.org/records/11371816
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref13">
    <label>13</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     van Hoorn, A., Waller, J. and Hasselbring, W. (2012) Kieker: A Framework for Application Performance Monitoring and Dynamic Software Analysis. Proceedings of the 3rd ACM/SPEC International Conference on Performance Engineering, Boston, 22-25 April 2012, 247-248. &gt;https://doi.org/10.1145/2188286.2188326
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref14">
    <label>14</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Hasselbring, W. and van Hoorn, A. (2020) Kieker: A Monitoring Framework for Software Engineering Research. Software Impacts, 5, Article ID: 100019. &gt;https://doi.org/10.1016/j.simpa.2020.100019
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref15">
    <label>15</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Overbey, J.L., Negara, S. and Johnson, R.E. (2009) Refactoring and the Evolution of Fortran. 2009 ICSE Workshop on Software Engineering for Computational Science and Engineering, Vancouver, 23 May 2009, 28-34. &gt;https://doi.org/10.1109/secse.2009.5069159
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref16">
    <label>16</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Bogner, J., Wagner, S. and Zimmermann, A. (2017) Automatically Measuring the Maintainability of Service-and Microservice-Based Systems. Proceedings of the 27th International Workshop on Software Measurement and 12th International Conference on Software Process and Product Measurement, Gothenburg, 25-27 October 2017, 107-115. &gt;https://doi.org/10.1145/3143434.3143443
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref17">
    <label>17</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Candela, I., Bavota, G., Russo, B. and Oliveto, R. (2016) Using Cohesion and Coupling for Software Remodularization: Is It Enough? ACM Transactions on Software Engineering and Methodology, 25, 1-28. &gt;https://doi.org/10.1145/2928268
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref18">
    <label>18</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Allen, E.B. (2002) Measuring Graph Abstractions of Software: An Information-Theory Approach. Proceedings 8th IEEE Symposium on Software Metrics, Ottawa, 4-7 June 2002, 182-193. &gt;https://doi.org/10.1109/metric.2002.1011337
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref19">
    <label>19</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Gamma, E., Helm, R., Johnson, R. and Vlissides, J. (1996) Design Patterns—Elements of Reusable Object-Oriented Software. Addison-Wesley.
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref20">
    <label>20</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Kieker Project (2021) Kieker Development Tools.
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref21">
    <label>21</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Adcroft, A., et al. (2022) MITgcm’s User Manual.
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref22">
    <label>22</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Alexander, K. and Easterbrook, S.M. (2015) The Software Architecture of Climate Models: A Graphical Comparison of CMIP5 and EMICAR5 Configurations. Geoscientific Model Development, 8, 1221-1232. &gt;https://doi.org/10.5194/gmd-8-1221-2015
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref23">
    <label>23</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Simm, W.A., Samreen, F., Bassett, R., et al. (2018) SE in ES: Opportunities for Software Engineering and Cloud Computing in Environmental Science. Proceedings of the 40th International Conference on Software Engineering: Software Engineering in Society, Gothenburg, 27 May-3 June 2018, 61-70.&gt;https://dl.acm.org/doi/10.1145/3183428.3183430
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref24">
    <label>24</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Collins, W.J., Bellouin, N., Doutriaux-Boucher, M., Gedney, N., Halloran, P., Hinton, T., et al. (2011) Development and Evaluation of an Earth-System Model-HadGEM2. Geoscientific Model Development, 4, 1051-1075. &gt;https://doi.org/10.5194/gmd-4-1051-2011
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref25">
    <label>25</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Giorgetta, M.A., Jungclaus, J., Reick, C.H., Legutke, S., Bader, J., Böttinger, M., et al. (2013) Climate and Carbon Cycle Changes from 1850 to 2100 in MPI‐ESM Simulations for the Coupled Model Intercomparison Project Phase 5. Journal of Advances in Modeling Earth Systems, 5, 572-597. &gt;https://doi.org/10.1002/jame.20038
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref26">
    <label>26</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Hurrell, J.W., Holland, M.M., Gent, P.R., Ghan, S., Kay, J.E., Kushner, P.J., et al. (2013) The Community Earth System Model: A Framework for Collaborative Research. Bulletin of the American Meteorological Society, 94, 1339-1360. &gt;https://doi.org/10.1175/bams-d-12-00121.1
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref27">
    <label>27</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Riva, C. and Rodríguez, J.V. (2002) Combining Static and Dynamic Views for Architecture Reconstruction. 6th European Conference on Software Maintenance and Reengineering (CSMR 2002), Budapest, 11-13 March 2002, 47.&gt;https://ieeexplore.ieee.org/document/995789
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref28">
    <label>28</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Jung, R., Gundlach, S. and Hasselbring, W. (2022) Thematic Domain Analysis for Ocean Modeling. Environmental Modelling&amp;Software, 150, Article ID: 105323. &gt;https://doi.org/10.1016/j.envsoft.2022.105323
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref29">
    <label>29</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Schnoor, H. and Hasselbring, W. (2020) Comparing Static and Dynamic Weighted Software Coupling Metrics. Computers, 9, Article No. 24. &gt;https://doi.org/10.3390/computers9020024
    </mixed-citation>
   </ref>
   <ref id="scirp.141591-ref30">
    <label>30</label>
    <mixed-citation publication-type="other" xlink:type="simple">
     Levenshtein, V.I. (1966) Binary Codes Capable of Correcting Deletions, Insertions and Reversals. Soviet Physics Doklady, 10, 707-710.
    </mixed-citation>
   </ref>
  </ref-list>
 </back>
</article>