diff --git a/ProcessLib/BoundaryConditionAndSourceTerm/SourceTermCollection.cpp b/ProcessLib/BoundaryConditionAndSourceTerm/SourceTermCollection.cpp
index f006d574484d34b90f4c1ba69ceb5f3fdba07681..fb028dfe233fb07627fdeb5a17c03d7317d8ac57 100644
--- a/ProcessLib/BoundaryConditionAndSourceTerm/SourceTermCollection.cpp
+++ b/ProcessLib/BoundaryConditionAndSourceTerm/SourceTermCollection.cpp
@@ -10,6 +10,8 @@
 
 #include "SourceTermCollection.h"
 
+#include <range/v3/view/filter.hpp>
+
 namespace ProcessLib
 {
 void SourceTermCollection::addSourceTermsForProcessVariables(
@@ -34,7 +36,12 @@ void SourceTermCollection::addSourceTermsForProcessVariables(
 void SourceTermCollection::integrate(const double t, GlobalVector const& x,
                                      GlobalVector& b, GlobalMatrix* jac) const
 {
-    for (auto const& st : _source_terms)
+    // For parallel computing with DDC, a partition may not have source term
+    // but a nullptr is assigned to its element in _source_terms.
+    auto non_nullptr = [](std::unique_ptr<SourceTerm> const& st)
+    { return st != nullptr; };
+
+    for (auto const& st : _source_terms | ranges::views::filter(non_nullptr))
     {
         st->integrate(t, x, b, jac);
     }