Passa al contenuto principale

Water Scarcity GFM

Il Gap Filling Module Scarsita Idrica calcola l'impronta della scarsita idrica dei prodotti alimentari combinando dati di consumo idrico specifici del prodotto con indici regionali di stress idrico. Questo approccio tiene conto del fatto che il consumo di acqua in regioni con scarsita idrica ha un impatto ambientale maggiore dello stesso consumo in regioni con abbondanza d'acqua.

Riferimento Rapido

ProprietaDescrizione
Eseguito suModeledActivityNode con genitore FoodProductFlowNode contenente un nome prodotto
DipendenzeOriginGapFillingWorker
Input ChiaveTipo di prodotto (termine FoodEx2), paese di origine
OutputFlusso di consumo di acqua scarsa in metri cubi
TriggerProdotto abbinato a un identificatore di impronta della scarsita idrica

Quando Viene Eseguito

Il modulo si attiva quando:

  1. Un ModeledActivityNode ha un genitore FoodProductFlowNode con un nome prodotto
  2. Il prodotto e abbinato a un identificatore di impronta della scarsita idrica nel glossario
  3. Il modulo e pianificato sul nodo foglia Brightway (all'origine)

Output Chiave

Il modulo aggiunge un flusso di consumo di acqua scarsa al grafo di calcolo:

  • Consumo di Acqua Scarsa: Misurato in metri cubi (m3) per chilogrammo di prodotto
  • Collegato a un ElementaryResourceEmissionNode per il calcolo dell'impatto

Metodologia Scientifica

Il modello di scarsita idrica utilizza fattori dell'Indice di Stress Idrico (WSI) forniti da Scherer e Pfister (2016). Questa metodologia include esplicitamente lo stress idrico regionale come fattore di ponderazione per il consumo di acqua dolce, fornendo una misura ambientalmente piu significativa del semplice volume d'acqua.

Approccio dell'Indice di Stress Idrico

L'impronta della scarsita idrica e calcolata usando la formula:

Acqua Scarsa [L/kg] = Consumo di Acqua Blu [L/kg] * Indice di Stress Idrico [adimensionale]

Dove:

  • Consumo di Acqua Blu: La quantita di acque superficiali e sotterranee consumate durante la produzione
  • Indice di Stress Idrico: Un fattore regionale che rappresenta la scarsita idrica (scala da 0 a 1)

Stress Idrico Regionale

Lo stress idrico dipende da:

  • La quantita di acqua consumata in una regione rispetto all'acqua naturalmente disponibile dalle precipitazioni
  • Correzioni per l'acqua che viene restituita al bacino idrografico (per esempio, dopo il raffreddamento nella produzione di elettricita)

Il database include fattori di scarsita idrica differenziati per 162 paesi, consentendo valutazioni regionali accurate.

Flusso di Calcolo

Quantita Prodotto [g] -> Converti in [kg] -> Fattore WSI [L acqua scarsa/kg] -> Acqua Scarsa [L]

Il calcolo viene eseguito al livello piu basso del grafo e aggregato fino al prodotto principale.


Dettagli di Implementazione

Fonte dei Dati

I fattori di scarsita idrica sono memorizzati in EDB_water_expected_wsi_per_kg_country_excel_corrected.xlsx, che contiene:

  • Identificatori prodotto (WS_ID)
  • Fattori WSI specifici per paese per 162 paesi
  • Valori mediani per calcoli di fallback

Logica di Abbinamento

I prodotti sono abbinati ai dati di scarsita idrica attraverso:

  1. Termini FoodEx2 dal nome del prodotto
  2. Collegamenti al glossario che mappano combinazioni di termini a identificatori di scarsita idrica
water_scarcity_term_uid = self.gfm_factory.linked_water_scarcity_terms.get(
frozenset([term.uid for term in parent_flow_product_name_terms])
)

Gestione del Codice Paese

Il modulo gestisce i codici paese come segue:

  1. Recupera la proprieta flow_location dal prodotto o dai nodi genitori
  2. Converte i codici ISO a 3 lettere in codici a 2 lettere usando iso_3166_map_3_to_2_letter
  3. Cerca il fattore WSI specifico del paese

Comportamento di Fallback

ScenarioComportamento
Nessuna origine trovataUsa la mediana di tutti i paesi disponibili
Origini multiple trovateUsa la mediana di tutti i paesi disponibili
Origine non nella tabella WSIUsa la mediana per quel prodotto tra tutti i paesi
Prodotto non nella tabella WSIScarsita idrica impostata a zero
Prodotto senza ID WSIScarsita idrica impostata a zero

Esclusione del Trasporto

Il modulo salta i flussi relativi al trasporto per evitare doppi conteggi:

if product_name_term.sub_class_of == self.gfm_factory.root_transport_term.uid:
transport_term = True
if transport_term:
continue

Gestione dei Prodotti Essiccati

Per gli ingredienti che sono suddivisi in versioni fresche ed essiccate (tramite il Water Loss GFM):

  • La scarsita idrica e calcolata per la quantita di ingrediente fresco
  • La scarsita idrica e calcolata anche per la quantita di ingrediente fresco corrispondente alla versione essiccata
  • Questo tiene correttamente conto della maggiore quantita di prodotto fresco necessaria per produrre versioni essiccate

Modifiche al Grafo

Il modulo esegue le seguenti modifiche al grafo:

Passo 1: Rimuovere l'Arco Originale

remove_edge_mutation = RemoveEdgeMutation(
from_node_uid=parent_flow.uid,
to_node_uid=self.node.uid,
)

Passo 2: Creare l'Attivita di Consumo Idrico

water_consumption_activity = FoodProcessingActivityNode.model_construct(
uid=UuidStr(uuid4()),
production_amount=self.node.production_amount.duplicate(),
)

Passo 3: Ristabilire le Connessioni di Flusso

Il modulo crea un nuovo nodo di flusso alimentare tra l'attivita di consumo idrico e il nodo Brightway originale.

Passo 4: Aggiungere il Flusso di Acqua Scarsa

scarce_water_consumption_flow = FlowNode.model_construct(
uid=UuidStr(uuid4()),
product_name=NamesProp.unvalidated_construct(
terms=[
GlossaryTermProp.unvalidated_construct(
term_uid=self.gfm_factory.scarce_water_consumption_term.uid
)
]
),
amount_in_original_source_unit=QuantityProp.unvalidated_construct(
# Il segno negativo indica il consumo
value=-production_amount_in_kg * scarce_water_consumption_m3_per_kg,
unit_term_uid=self.gfm_factory.cubic_meter_term.uid,
for_reference=ReferenceAmountEnum.amount_for_activity_production_amount,
),
)

Passo 5: Collegare al Nodo Risorsa Elementare

Il flusso di acqua scarsa e collegato a un ElementaryResourceEmissionNode condiviso per la valutazione dell'impatto.


Riferimento Codice Completo

Logica di Pianificazione del Worker

def should_be_scheduled(self) -> bool:
"""Whether to schedule water scarcity gap filling worker."""
if (
isinstance(self.node, ModeledActivityNode)
and self.node.get_parent_nodes()
and any(
isinstance(parent_node, FoodProductFlowNode) and parent_node.product_name
for parent_node in self.node.get_parent_nodes()
)
):
return True
return False

Verifica della Prontezza all'Esecuzione

def can_run_now(self) -> GapFillingWorkerStatusEnum:
"""Whether water scarcity gap filling worker can be executed."""
global_gfm_state = self.get_global_gfm_state()

# Attendi la determinazione dell'origine
if global_gfm_state.get(OriginGapFillingWorker.__name__, 0) == NodeGfmStateEnum.scheduled.value:
return GapFillingWorkerStatusEnum.reschedule

# Esegui solo sul nodo foglia Brightway
if any(isinstance(sub_node, FoodProductFlowNode) for sub_node in self.node.get_sub_nodes()):
return GapFillingWorkerStatusEnum.cancel

return GapFillingWorkerStatusEnum.ready

Calcolo della Scarsita Idrica

# Converti la quantita di produzione in chilogrammi
production_amount_unit: Term = self.node.production_amount.get_unit_term()
production_amount_in_kg = UnitWeightConverter.convert_between_same_unit_types(
self.node.production_amount.value,
production_amount_unit,
self.gfm_factory.kilogram_term,
"mass-in-g",
)

# Cerca il fattore specifico del paese
if flow_country_code in water_scarcity_term.data:
scarce_water_consumption_m3_per_kg = water_scarcity_term.data[flow_country_code]
else:
# Fallback alla mediana
scarce_water_consumption_m3_per_kg = water_scarcity_term.data["median"]

# Calcola il consumo di acqua scarsa
scarce_water_value = -production_amount_in_kg * scarce_water_consumption_m3_per_kg

Inizializzazione della Factory

Il WaterScarcityGapFillingFactory inizializza i seguenti dati in cache:

Termini delle Unita

self.cubic_meter_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_cubic-meter", root_unit_term.access_group_uid)
)
self.liter_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_liter", root_unit_term.access_group_uid)
)
self.kilogram_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_kilogram", root_unit_term.access_group_uid)
)

Cache dei Collegamenti al Glossario

water_scarcity_glossary_links = await self.service_provider.glossary_link_service.get_glossary_links_by_gfm(
gap_filling_module="WaterScarcity"
)
for water_scarcity_glossary_link in water_scarcity_glossary_links:
self.linked_water_scarcity_terms[
frozenset(water_scarcity_glossary_link.term_uids)
] = water_scarcity_glossary_link.linked_term_uid

Esempio di Calcolo

Scenario: 500g di pomodori dalla Spagna

Passo 1: Convertire in Chilogrammi

500g = 0,5 kg

Passo 2: Cercare il Fattore WSI

Dal database della scarsita idrica per i pomodori in Spagna:

Fattore WSI = 142,3 L di acqua scarsa/kg

Passo 3: Calcolare l'Acqua Scarsa

Acqua Scarsa = 0,5 kg * 142,3 L/kg = 71,15 L di acqua scarsa

Passo 4: Convertire in Metri Cubi

71,15 L = 0,07115 m3 di acqua scarsa

Confronto per Origine

Gli stessi pomodori da origini diverse avrebbero impatti diversi:

OrigineFattore WSI (L/kg)Acqua Scarsa (L) per 500g
Spagna142,371,15
Paesi Bassi12,86,40
Marocco285,6142,80
Italia98,449,20

Questo dimostra perche i fattori di stress idrico specifici dell'origine sono critici per una valutazione ambientale accurata.


Limitazioni Note

Copertura dei Dati

  • 162 paesi coperti: La maggior parte dei principali paesi produttori di alimenti e inclusa
  • Paesi mancanti: Alcuni paesi potrebbero non avere dati WSI; vengono usati valori mediani come fallback
  • Copertura prodotti: Non tutti i prodotti alimentari hanno ID di scarsita idrica assegnati

Limitazioni dell'Ereditarieta

L'implementazione attuale non supporta l'ereditarieta degli ID di scarsita idrica tra prodotti correlati:

  • Nel sistema legacy, i prodotti potevano ereditare ID WSI da prodotti collegati
  • Nell'implementazione attuale, i prodotti senza un ID WSI diretto ricevono zero scarsita idrica
  • Questo puo risultare in una sottostima per alcuni prodotti (per esempio, farine speciali che potrebbero ereditare dalla farina generica)

Risoluzione dei Dati

  • Solo risoluzione a livello di paese (nessuna differenziazione sub-nazionale)
  • Non tiene conto delle variazioni stagionali nello stress idrico
  • Usa valori attesi (medi) piuttosto che dati specifici dell'anno reale

Fallback alla Mediana

Quando vengono usati valori mediani (origine sconosciuta, dati paese mancanti), non viene visualizzato alcun avviso nell'output. Questo e un comportamento noto documentato nelle revisioni scientifiche.


Fonti dei Dati

Fonte Primaria

Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.

I dati sulla scarsita idrica combinano:

  • Consumo di acqua blu da database Life Cycle Assessment
  • Valori dell'Indice di Stress Idrico basati sulla disponibilita idrica a livello di bacino idrografico

Struttura del Database

I fattori di scarsita idrica sono memorizzati nell'Eaternity Database (EDB) con:

  • water-scarcity-footprint-id: Collega i prodotti alle voci di dati WSI
  • Valori specifici per paese: Memorizzati per ogni combinazione prodotto-paese
  • Valori mediani: Pre-calcolati per scenari di fallback

Riferimenti

  1. Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.

  2. Pfister, S., Koehler, A., & Hellweg, S. (2009). Assessing the environmental impacts of freshwater consumption in LCA. Environmental Science and Technology, 43(11), 4098-4104.

  3. Eaternity Database (EDB). Water Scarcity Footprint Data. Internal documentation.